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

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

 

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