iBatis會自動緩存每條查詢語句的列名映射,對於動態查詢字段或分頁查詢等queryForPage, queryForList,就可能產生“列名無效”、rs.getObject(object)異常錯誤。
當出現動態改變查詢列,或者其他方式動態改變的時候,都需要設置remapResults="true"這個屬性,因此不至於出現“列名無效”的錯誤。其實,這個錯誤拋出的地方是resultSet.getString(“xx”);方法,因為iBATIS保留了第一次的列名,所以第二次查詢的時候resultSet獲得的還是第一次保留下來的列名。
解決辦法:
在SQL語句上加一個屬性(remapResults)配置讓每次執行都重新映射列名。
注:僅在可能被queryForPage()和queryForList()都調用、或者動態字段的SQL語句上加此屬性。(以犧牲性能為代價,損耗很小很小)。
如下所示:
<select id="queryPartyRole" parameterClass="long" resultClass="java.util.HashMap" remapResults="true"></select>