Kuina-Dao 開発記 Dynamic Query

問い合わせのたびに条件が変わる Dynamic Query 機能の一部を SVN にコミットしました.
あ,SVN から取ってきた後とか,ソースをいぢってビルドした後とかは Diigu ってあげないとテストで失敗しちゃいます.
クリーンビルド (Alt+P, N) すると手っ取り早く Diigu ることができます.
お試し頂ける際には忘れずに.


ともあれ (JW),Dynamic Query は問い合わせ条件に含めるエンティティのプロパティを DAO メソッドの引数として指定することができるというものです.
例えば

public interface EmployeeDao {
    List<Employee> findByProperty(String name, Integer height, Integer weight, String bloodType);
    ・・・
}

なんてメソッドがあると,このメソッドが呼び出された際に null でない引数を検索条件に含めて問い合わせを行います.
今のところ,引数で指定できるのはこの程度.


次は引数にエンティティを指定する,Hibernate でいうところの Query by Example を実装する予定.

public interface EmployeeDao {
    List<Employee> findByExample(Employee employee);
    ・・・
}

引数で渡したインスタンスの主キー以外かつ null でないプロパティを問い合わせ条件に含めます.


その後は結合かな.
どうやって結合を指定するかアレコレ悩んだのですが,アノテーションとかできるだけ使わずに,

    List<Employee> findByProperty(String name, String belongTo$department$name);
    List<Employee> findByExample(Employee employee, Department belongTo$department);

って感じにしようかと.
'$' で区切られた引数名から結合を組み立てられるんじゃないかなぁ,と.


ちなみに Kuina-Dao のテストケースとして使っているテーブル/エンティティは,はぶさんの「SQL 書き方ドリル (isbn:4774122998)」を パクった インスパイヤされたので,

+----------+      +----------+      +------------+
| Employee |◇--●| BelongTo |●--◇| Department |
+----------+      +----------+      +------------+

って関連になってます.
なので,最初のメソッドの belongTo$department$name は基点となる Employee から見て,belongTo を辿って departmentname プロパティを問い合わせ条件に含めることを意味するという具合.
そんなわけで (どんなわけで?),

SELECT
        employee 
FROM
        Employee employee
            INNER JOIN employee.belongTo AS belongTo
            INNER JOIN belongTo.department AS department
WHERE
        employee.name = :name
    AND department.name = :belongTo$department$name

みたいな問い合わせを作ることになります.
内部結合ではなく,外部結合を使う時はアノテーションかなぁ.それも微妙かなぁ.

もっといいアイディアあれば提案お願いします.