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
を辿って department
の name
プロパティを問い合わせ条件に含めることを意味するという具合.
そんなわけで (どんなわけで?),
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
みたいな問い合わせを作ることになります.
内部結合ではなく,外部結合を使う時はアノテーションかなぁ.それも微妙かなぁ.
もっといいアイディアあれば提案お願いします.