zoukankan      html  css  js  c++  java
  • 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,不过这个应该跟数据的关系不大。




  • 相关阅读:
    SQL Server数据库中批量替换数据的方法
    js 鼠标移上去弹出层效果
    50个jQuery代码段帮你成为更好的JavaScript开发者
    MSN、腾讯QQ、SKYPE、阿里旺旺网页在线客服源代码
    正则表达式基础知识
    常用邮箱POP3和SMTP服务器汇总
    CS5序列号
    如何使用Oracle SQLDeveloper 中连接MS SQLServer和MySQL数据库
    Silverlight与后台数据库的三种技术实现基本的互操作(转)
    ADO 与ADO.NET
  • 原文地址:https://www.cnblogs.com/jdluojing/p/3212410.html
Copyright © 2011-2022 走看看