ひがやすを技術ブログ

電通国際情報サービスのプログラマ

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はこんな感じ。


select ...
/*WHERE*/
WHERE句は、Conditionオブジェクト(S2JDBCのWhereオブジェクト)を使って組み立てます。fooとbarは引数だと思ってください。

jdbcManager.selectBySqlFile(".../hoge.sql")
.where(new AndCondition().eq("foo", foo).eq("bar", bar))
.getResultList(Hoge.class);
AndConditionは、S2JDBCのSimpleWhereと同じです。fooやbarがnullならWHERE句から外れます。
条件は、文字列で組み立てることもできます。

.where("foo = ? and bar = ?", foo, bar)
このWHEREコメントの導入により、JavaのロジックでWHERE句を組み立てることができます。SQLファイルから、ロジックは取り除かれます。


Slim3 JDBCでは、SQLの骨格は素直にSQLで。バインド変数は、もちろんバインド変数コメントを使うことで、2Way SQL。ただし、ロジック的な部分はJavaで組み立てる。
と思うと間違いがないです。