ORなどを含む複雑なSQL。
いまさらだけど、S2DAOでの実開発にも関連するので、S2JDBCでどうするのだったか調べてみようと思います。その勉強向けメモ。
何ヶ月か前に一度ドキュメントは通読したのだけど、忘れている。
たとえば
SELECT e.*, d.* FROM employee e LEFT OUTER JOIN department d ON e.department_id=d.id WHERE e.name LIKE ? /* ←無指定時は条件に追加しない(以下同様) */ AND ( e.salary BETWEEN ? AND ? OR e.job_type IN (?, ?, ?)) ORDER BY d.name, e.name
こういうのはS2JDBCだと
(1)ComplexWhere
とかを駆使するか、
(2)where(String, Object...)
を使うのか・・・
否(3)外だしSQLを使うのかな。
(2)の方法だと、S2DaoでEntityManager
を使うのとあまり変わりませんが、それだと以前にS2Dao用に作った http://d.hatena.ne.jp/proust/20071112#1196264765 のクラスがそのまま使えます。それの考え方だと、ぜんぜん流れるようではないのだけど、static import・可変長引数を使って概略
.where( and( like("name", name), or ( between("salary", from, to), eq("job_type", jobTypes) ) ) ).orderBy("d.name, e.name") .getResultList();
のように書けそう。前置(ポーランド)記法は一見わけがわからないけど、慣れればありだと思います。というか、構文解析で変なことにならずにorなどを取り入れるには、こうせざるを得ないので・・・
これが必要になるのは、検索フォームに値が入っている場合のみ検索条件にするような場合で、かつ誰がが設計したわけのわからないテーブル設計のために、OR
を使わなければならないようなとき(^^;)。
実はS2JDBCが標準でサポートしている、もっと簡単な方法もあるのかもしれないけど、夜更かししないようにいったん終了。