`
jdluojing
  • 浏览: 17965 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

JdbcTemplate 排序查询结果不一致问题

 
阅读更多

在程序中使用Spring的JdbcTemplate来进行sql操作,其中需要对返回的数据进行排序,由于排序字段可能根据需要的不同而有所变化,于是使用了占位符“?”。执行后没有报错,但是查询出来的数据和直接写sql语句在数据库中查询出来的顺序不一致。

程序代码如下:

JdbcTemplate jdbcTemplate = this.getJdbcTemplate();
		String sql = "select USER_NAME,PIC_URL,COUNTY_NAME,STAR,DEVOTE,SKILL,THE_LORE,POPULAR,ERROR_NUM from "
				+ "TF_SERVSTAR_RACE_USER as a,"
				+ "TF_SERVSTAR_SCORE_DETAIL as b "
				+ "where a.USER_TYPE = ? and a.BOSS_ID = b.BOSS_ID "
				+ "order by STAR DESC fetch first " + num + " rows only";

		List list = jdbcTemplate.queryForList(sql,
				new Object[] { userType + "" });

结果发现查询出来的结果并没有按照我指定的字段来排序,也没看出是哪儿写错了,真是郁闷。后来把sql直接拿到数据库中执行,出来的结果又是正确的,我仅仅是将占位符换成了实际的值,说明是JdbcTemplate在将参数设置到sql语句时发生了错误。经过排查,果然是这样的。因为我传的参数是字符串类型,所以JdbcTemplate在将参数设置到sql中时转换为对应的数据类型时会加上一个引号。但是加不加引号数据库都不会报错。

在数据中的测试:

不加引号:

Sql:

select USER_NAME,PIC_URL,COUNTY_NAME,STAR,DEVOTE,SKILL,THE_LORE,POPULAR,ERROR_NUM from 
TF_SERVSTAR_RACE_USER as a,
TF_SERVSTAR_SCORE_DETAIL as b 
where a.USER_TYPE = 2 and a.BOSS_ID = b.BOSS_ID 
order by 'STAR' desc fetch first 3 rows only;

加上引号:

Sql:

select USER_NAME,PIC_URL,COUNTY_NAME,STAR,DEVOTE,SKILL,THE_LORE,POPULAR,ERROR_NUM from 
TF_SERVSTAR_RACE_USER as a,
TF_SERVSTAR_SCORE_DETAIL as b 
where a.USER_TYPE = '2' and a.BOSS_ID = b.BOSS_ID 
order by 'STAR' desc fetch first 3 rows only;

目前没想到什么好方法可以解决这个问题。可以将排序字段设置为类的常量字段,然后sql中使用拼接,或者写个条件来判断输入得出对应的排序字段然后拼接,目前我是使用硬编码。如果诸位也遇到过类似的问题,有什么好的解决办法,烦请告诉一声。对了,我数据库用的是DB2,不过这个应该跟数据的关系不大。





分享到:
评论

相关推荐

    lucene+jdbcTemplate封装API+缓存实现索引精确刷新

    1. 锁机制:在更新索引时,使用锁来避免并发控制中的数据不一致问题。 2. 搜索API封装:设计易于使用的搜索接口,供其他模块调用,进行全文检索。 3. 错误处理:包含了异常捕获和日志记录,以保证系统的稳定性和可...

    SSH整合练习增删改查

    4. **排序与搜索**:在描述中提到了排序和搜索功能,这通常涉及到SQL查询的ORDER BY子句和LIKE条件,或者通过Spring的数据访问抽象层(如HibernateTemplate或JdbcTemplate)来实现。排序允许用户按照特定字段对结果...

    数据库操作增删改查模糊查

    基础的查询可以是获取单个记录或所有记录,而复杂的查询可能涉及条件、排序和分页。模糊查询允许用户输入部分信息来搜索匹配的记录。在DAO中,`find()`方法可以处理各种查询需求,例如: ```java public List...

    基于Spring框架实现用户的登陆和注册

    5. **掌握JdbcTemplate的使用**:JdbcTemplate是Spring提供的数据库操作工具,简化了SQL查询和参数绑定,提供了事务管理的支持。 6. **掌握Spring中事务的使用**:Spring的事务管理机制确保数据操作的原子性、一致...

    Struts2+Hibernate+Spring三大框架集成范例

    查询功能可能包括SQL查询的构建、分页、排序等,这些都可以通过Hibernate的HQL或 Criteria API实现。 6. **数据操作**:在数据操作部分,Hibernate提供了一套完整的CRUD(创建、读取、更新、删除)API,通过Session...

    SpringStruts2HibernateAjax(基于javaBean数据操作)

    在本教程中,你将学习如何配置Spring的IoC容器,以及如何使用Spring的数据访问支持,如JdbcTemplate和HibernateTemplate,来处理数据库操作。 Struts2是MVC(Model-View-Controller)架构的实现,它简化了前端逻辑...

    网上资源管理系统(ssm)-数据库

    此外,还可以利用JOIN操作合并多个表的数据,WHERE子句过滤特定条件的结果,GROUP BY和HAVING进行数据分组和过滤,ORDER BY进行排序等。 6. **事务管理**:在数据库操作中,事务管理确保数据的一致性和完整性。例如...

    移动护理springMVC+maven+oracle

    JdbcTemplate是Spring提供的一个简单JDBC模板类,它封装了JDBC的基本操作,减少了手动处理SQL和结果集的工作量,提高了代码的可读性和可维护性。 **ZTree** ZTree是一款基于jQuery的灵活的树形插件,常用于展示层次...

    基于SpringBoot的论坛系统源码数据库.zip

    3. 数据访问:使用MyBatis或JdbcTemplate进行数据库操作,涉及SQL查询、事务管理等。 4. 用户认证与授权:如使用Spring Security实现用户登录、权限控制。 5. 模板引擎:可能使用Thymeleaf或JSP作为视图层,渲染...

    spring-data:测试项目spring数据

    这个框架的核心在于提供一个一致的编程模型,使得开发者可以使用 Spring 的强大功能来处理各种数据存储技术,如关系型数据库、NoSQL 数据库、图形数据库等。在"spring-data"测试项目中,我们主要会接触到以下几个...

Global site tag (gtag.js) - Google Analytics