Javaメソッド可変長引数(variable length arguments)使用での
SQLアノテーション
リストを引数にした場合のサンプル
@Select("<script>SELECT * FROM tb_items WHERE 1=1" + " AND item_id IN <foreach collection='list' item='id'" + " separator=',' open='(' close=')'>#{id}</foreach>" + "</script>") public List<Item> getItems(List<Integer> idlist);
list という予約された単語が使える。
配列なら array なのである。
@Select("<script>SELECT * FROM tb_items WHERE 1=1" + " AND item_id IN <foreach collection='array' item='id'" + " separator=',' open='(' close=')'>#{id}</foreach>" + "</script>") public List<Item> getItems(int...args);
このままでは、引数無しで呼ばれたときに動かないSQLにになるので
@Select("<script>SELECT * FROM tb_items WHERE 1=1" + "<if test='array.length > 0'>" + " AND item_id IN <foreach collection='array' item='id'" + " separator=',' open='(' close=')'>#{id}</foreach>" + "</if></script>") public List<Item> getItems(int...args);
list でも同じことで、if 文が必要ではある。
SQLアノテーションでこのように foreach を書いた時に、アノテーションに渡す文字列のエスケープ
open=\"(\"
と書かなくてもシングルクォーテーションでXML属性値を書いても
open='('
ちゃんと認識してくれる。