Curl Global Community
iBatis で正常なクエリなのにエラーになる - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: iBatis で正常なクエリなのにエラーになる (/showthread.php?tid=1029)



iBatis で正常なクエリなのにエラーになる - umemura - 01-16-2014

Curl に直接関係する問題ではないのですが、
サーバ側で、DBにアクセスする際に、iBatis を利用しており、
同一の SQL-ID を利用しているのに、初回はうまくいき、
2回目はエラー(java.sql.SQLException: Column not found:)になる、
という現象が起きています。


対象のSQLは、集約条件をパラメタで渡すようなSELECT文なのですが、
発行されたSQLをログ出力し、そのSQLをツール(SQL Developer)で流してみると、
問題なく結果が返却されます。

SQL文自体が正常ということは、利用しているiBatis のバグなのかな、
と思うのですが、同様の問題は、他のCurl 案件で起きていないでしょうか。


RE: iBatis で正常なクエリなのにエラーになる - umemura - 01-16-2014

エラーになるSELECT文は、条件に応じて項目数が動的に変わるため、
検索結果(iBatis でいうところのresultClass)をHashMap にしていますが、
初回と、2回目で集約条件となるパラメタを変更しています。

どうやら、以前のクエリ発行時に作成したHashMap を、iBatis側でキャッシュしているため
初回にキャッシュしたHashMpaに対して、
2回目で取得した項目をセットしようとしたとき、
検索結果の項目数に差があると、
キャッシュしているHashMap に対してキーがないため、エラーになる、ということのようです。

とりあえず、項目の増減が発生しないように、すべての項目をハッシュのキーに指定するようにし、
利用しない項目については、値をnullにして判断するよう修正して対応しました。

iBatisの設定として、select タグに remapResults="true" を設定すれば、キャッシュをクリアしてくれるようですが、
こちらはまだ試していないです。

http://www.sorich.jp/blog/shimamura/2008/11/ibatisselect.html