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會在每次查詢的時候內省查詢結果來設置元數據,來保證返回恰當的結果。這個屬性會造成一定的性能損失,所以要謹慎使用,只在你需要的時候使用.