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)の方法だと、S2DaoEntityManagerを使うのとあまり変わりませんが、それだと以前に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が標準でサポートしている、もっと簡単な方法もあるのかもしれないけど、夜更かししないようにいったん終了。