日期:2014-05-16  浏览次数:20418 次

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,不过这个应该跟数据的关系不大。