ibatis resultclass「java.util.hashmap」キャッシュの問題


ibatisプロジェクトの作成中に次のスタイルのダイナミッククエリに遭遇しました.
<select id="searchByKW"      resultClass="java.util.HashMap"   
        parameterClass="java.util.HashMap">   
        <![CDATA[ 
     select * from $username$.$tablename$ where contains($username$.$tablename$.$colname$,'$kw$')>0 
     ]]>   
</select>  

 
このように異なるテーブルに対してクエリーを行い、結果をHashMapにマッピングすることができますが、使用中にこの文を初めて使用する場合は可能であることがわかりますが、この文を使用して別のテーブルタイムズを再クエリーすると間違っています.この問題は、クエリーのsqlの列が変化しているためですが、ibatisはRSのmeta情報をデフォルトでキャッシュします.1回目のクエリのカラムと2回目のクエリのカラムが異なる場合、2回目のibatisは1回目のクエリのカラムをkeyとしてRSからデータを取得しますが、あなたのカラムは変化するので、2回目のデータを取得するとき、RSにはあなたの1回目のカラムがなくなってしまうので、エラーが発生します.エラーの原因は、結果セットからHashMapへのマッピング時に前のテーブルのフィールドに従ってロードされ、ibatisが前のテーブルの構造をマッピングキャッシュしたことを示しています.
remapResultsというプロパティを使用すると、結果セットを再マッピングできます.
プロファイルは次のように変更されます.
<select id="searchByKW"  remapResults="true"   resultClass="java.util.HashMap"    parameterClass="java.util.HashMap">   
    <![CDATA[ 
         select * from $username$.$tablename$ where contains($username$.$tablename$.$colname$,'$kw$')>0 
     ]]>   
</select>