日期:2014-05-16 浏览次数:20451 次
在程序中使用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,不过这个应该跟数据的关系不大。