SQLのコメント式でforループをサポート!!

次のバージョンのDoma 0.9.10で入ります。

SQLファイルをこんな感じで書けます。

select * from EMPLOYEE where
/*%if names.size() > 0*/
  /*%for name : names*/
EMPLOYEE_NAME like /*@startWith(name)*/'hoge'--hasNext " or " --
  /*%end*/
/*%end*/

/*%for name : names*/ は Javaの拡張forループとおんなじ意味で、「:」の左側がループ毎の要素を表す変数、右側がIterableな式です。 /*%end*/までが繰り返されます。
--hasNext " or " -- は、次の要素がまだある場合のみ式の評価結果(この場合は「 or 」という文字列)を出力します。

使用例

(上のSQLファイルに関連付けられる)Daoのメソッド

@Select
List<Employee> selectByNames(List<String> names);

Daoのメソッドを呼ぶコード

EmployeeDao dao = new EmployeeDaoImpl();
dao.selectByNames(Arrays.asList("A", "B"));

実行されるSQL

select * from EMPLOYEE where
EMPLOYEE_NAME like 'A%' or EMPLOYEE_NAME like 'B%'

2行目の部分がforループで出力されています。「EMPLOYEE_NAME like 'A%'」と「EMPLOYEE_NAME like 'B%'」の間に「 or 」があって「EMPLOYEE_NAME like 'B%'」の後ろに「 or 」がないのはhasNextコメントが効いているからです。

ちなみに

Daoのメソッドを呼ぶコードで空のリストを渡すと

EmployeeDao dao = new EmployeeDaoImpl();
dao.selectByNames(Collections.emptyList());

実行されるSQLは、where句以下を除去したものになります。

select * from EMPLOYEE

これは/*%if 〜*/と/*%end*/で囲んでいるためにwhere句の要/不要判定機能が働いているからです。


これで、ほとんどの場合、JavaSQLを組み立てなくても大丈夫になるはず。