ibatis 当查询的结果集列明动态变化时,需要在select等标签上加上 remapResults="true"属性.

eg:

    <!-- 根据给定的参数查询出对应的月度活跃用户数据 -->
    <select id="listActiveStaffReportByMap" parameterClass="java.util.Map" resultClass="java.util.HashMap" remapResults="true">
        select uir.REGION_NAME   as PROVINCENAME,
               uir2.REGION_NAME  as CITYNAME,
               ist.STORE_ID      as STOREID,
               ist.STORE_NAME    as STORENAME,
               ist.STORE_ADDRESS as STOREADDR,
               uip.PLACE_NAME    as STOREPLACENAME,
               isf.STAFF_NAME    as STAFFNAME,
               isf.STAFF_MOBILE  as STAFFMOBILE,
               isf.STAFF_CODE    as STAFFID,
               isf.STAFF_STATUS  as STAFFSTATUS,
               sabms.*
          from ($staffActiveSql$) sabms
     left join INFO_STAFF isf      on sabms.STAFF_ID   = isf.STAFF_ID
     left join INFO_STORE ist      on isf.STORE_ID     = ist.STORE_ID
     left join UI_INFO_REGION uir  on ist.PROVINCE_ID  = uir.REGION_ID
     left join UI_INFO_REGION uir2 on ist.CITY_ID      = uir2.REGION_ID
     left join UI_INFO_PLACE uip   on ist.PLACE_ID     = uip.PLACE_ID
          <dynamic prepend="where">
                <isNotNull property="provinceId" prepend="and">
                        uir.REGION_ID = #provinceId#
                </isNotNull>
                <isNotNull property="cityId" prepend="and">
                        uir2.REGION_ID = #cityId#
                </isNotNull>
          </dynamic>
    </select>

这个查询的一部分是在服务器端拼成的staffActiveSql,,作为map参数的一部分传进来..一个是因为 这个子查询比较复杂,,再有就是为了可以复用.配置文件中的这个<select>..

本来以为一切正常,当我在点击使用了这个<select>的功能后,又去测试另一个类似的同样使用的该<select>的功能,,结果报异常了..(又是该死的列明无效...之前查询的时候也报过这个异常,是因为as别名使用了Oracle的关键字..)

原因:iBATIS会在每次查询的时候内省查询结果来设置元数据,来保证返回恰当的结果。这个属性会造成一定的性能损失,所以要谨慎使用,只在你需要的时候使用.

 

posted @ 2014-11-19 15:02  月光之殇  阅读(2997)  评论(0编辑  收藏  举报