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




posted @ 2012-07-25 22:07  心静欣  阅读(1608)  评论(0编辑  收藏  举报