zoukankan      html  css  js  c++  java
  • 记ibatis使用动态列查询问题(remapresults)

    博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

    今天在项目开发中,遇到了一个问题:使用ibatis 动态查询列时,每次返回的结果列都是第一次查询的结果列,然而控制台执行的SQL语句时包含该结果列的。比如:

    <select id="getUserByUserid" resultClass="java.util.HashMap" parameterClass="java.util.HashMap">
        SELECT col_0,
                   <isNotEmpty prepend="," property="Address">
                        col_1= #{col_1}
                    </isNotEmpty>
                    <isNotEmpty prepend="," property="Address">
                        col_2= #{col_2}
                    </isNotEmpty>
                    <isNotEmpty prepend="," property="Address">
                        col_3= #{col_3}
                    </isNotEmpty>
          FROM tab_1
    </select>

    你想要的效果是根据查询条件不同,返回的列不同。如果你这样写,假如当你执行第一次是,返回的结果列是col_0,col_1,但是当你执行第二次,变换了一下条件,你理想状态是返回col_0,col_2,col_3,但是实际结果还是返回col_0,col1。这是为什么呢??? ibatis会在第一次执行SQL是将结果列进行缓存,如果你第二次执行返回的结果列不同,ibatis还是会从从第一次的列key中进行取值,也就是resultSet对象中还是只会返回第一次的结果列(列值可以变化)。

    解决办法是:将select语句中remapResults属性设置为true。这样ibatis会在每次查询的时候内省结果列来设置resultSet,从而保证查询返回的结果列正确。这个属性设置会true后,会在造成一定的执行效率损失,比较天下没有白费的午餐,当你查询返回结果列动态变化的时候可以使用该属性。

  • 相关阅读:
    Win8杂谈
    ipad还能横行霸道多久
    C++异步编程 for VS2011(二)
    C++异步编程 for VS2011(一)
    互联网催生的新的商业模式
    微信小程序用户评分实例
    即时通讯小程序实现代码
    CDN(内容分发网络)技术原理 枯木
    RHEL6.3下Zabbix监控实践之Zabbix的安装 枯木
    Firefox浏览器完美运行Firefox OS 枯木
  • 原文地址:https://www.cnblogs.com/www-123456/p/10785773.html
Copyright © 2011-2022 走看看