へなちょこSEの考察

0x1E歳のへなちょこSEが、日々思うことを考察します。自社内、金融系を経て現在法人系PKG開発に従事。

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なんてもう使うなよ的な話かもしれませんが・・・。