記ibatis使用動態列查詢問題(remapresults)
今天在專案開發中,遇到了一個問題:使用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後,會在造成一定的執行效率損失,比較天下沒有白費的午餐,當你查詢返回結果列動態變化的時候可以使用該屬性。