SQLファイルのWHERE句をJavaのロジックで組み立てる
S2JDBC(やS2Dao)では、2Way SQLにIFやBEGINコメントを埋め込んで動的にWHERE句を組み立てていました。
select ... /*BEGIN*/ where /*IF foo != null*/ foo = /*foo*/1 /*END*/ /*IF bar != null*/ and bar = /*bar*/1 /*END*/ /*END*/
このSQLコメントを使った動的なSQL生成は、評判の良かった機能ですが、SQL文にロジックが入るとコンパイラでチェックできないので、何とかしたいと思っていました。
そこで、Slim3 JDBCで考え付いたのが、WHEREコメントを使って、Javaから動的にWHERE句を組み立てる方法です。SQLはこんな感じ。
WHERE句は、Conditionオブジェクト(S2JDBCのWhereオブジェクト)を使って組み立てます。fooとbarは引数だと思ってください。
select ...
/*WHERE*/
AndConditionは、S2JDBCのSimpleWhereと同じです。fooやbarがnullならWHERE句から外れます。
jdbcManager.selectBySqlFile(".../hoge.sql")
.where(new AndCondition().eq("foo", foo).eq("bar", bar))
.getResultList(Hoge.class);
条件は、文字列で組み立てることもできます。
このWHEREコメントの導入により、JavaのロジックでWHERE句を組み立てることができます。SQLファイルから、ロジックは取り除かれます。
.where("foo = ? and bar = ?", foo, bar)
Slim3 JDBCでは、SQLの骨格は素直にSQLで。バインド変数は、もちろんバインド変数コメントを使うことで、2Way SQL。ただし、ロジック的な部分はJavaで組み立てる。
と思うと間違いがないです。