iBatisのDynamicタグを使う際の注意点
iBatisのDynamicタグを使う際の注意点
iBatisなんて使ってる人いないかもですし、
MyBatisもそうなのか知りませんが、
今日つまずいたのでメモ。
isNotEmptyのprependを使った
WHERE句の直後に来るかもしれないところで、
必要だったのでprependを使いました。
SELECT a,b,c from sagyoTable <Dynamic prepend="WHERE"> <isNotEmpty prepend="AND" property="ymdFrom"> sagyoYmd >= #ymdFrom# </isNotEmpty> <isNotEmpty prepend="AND" property="ymdTo"> sagyoYmd <= #ymdTo# </isNotEmpty> </Dynamic>
まぁ、よくある使い方だと思います。
これで実行すると、WHEREはつくけど何故かANDが付かない。
書き方が悪いのかと思っていろいろ書き換えてみましたが、それでもうまくいかない。
なぜだ、なぜなんだ・・・・。
おや、他のとこでも同じプロパティを使ってるぞ・・・
よくよく見ると、同じプロパティを別のとこでも使ってる。
それも、使い方が違う。
具体的には、こんな感じ。
SELECT a,b,c from sagyoTable WHERE A = B <isNotEmpty property="ymdFrom"> AND sagyoYmd >= #ymdFrom# </isNotEmpty> <isNotEmpty property="ymdTo"> AND sagyoYmd <= #ymdTo# </isNotEmpty> ~~~
まさか、これに引きずられているのではあるまいか・・・。
そんなまさかと思いつつ、別の場所の書き方を変える。
SELECT a,b,c from sagyoTable WHERE A = B <isNotEmpty prepend="AND" property="ymdFrom"> sagyoYmd >= #ymdFrom# </isNotEmpty> <isNotEmpty prepend="AND" property="ymdTo"> sagyoYmd <= #ymdTo# </isNotEmpty> ~~~
動いた・・・
結論としては、同じプロパティを見るタグは同一のPrependを指定しておかないと、
別の場所の記述に引っ張られる可能性があるらしい。
ただ、どんなときに引っ張られるのかまでは検証できてない。
そもそも、iBatisなんてもう使うなよ的な話かもしれませんが・・・。