4

関連によって関連付けられたオブジェクトの値に基づいて、すべてのオブジェクト インスタンスのデータ ソースを検索したいと考えています。データ モデルは次のように簡略化できます。タイプ A のオブジェクトは、タイプ B のオブジェクトのリストを保持します。目標は、A が B を含み、B が X のプロパティ値を持つような A のすべてのインスタンスを見つけることです。

次のように Criteria クエリを使用して、これを既に正常に達成できます。

  List<A> results = session.createCriteria(A.class)
    .createCriteria("listOfBs")
    .add(Restrictions.eq("propertyInB", x))
    .list();

これは単純化したものであり、B の複数のプロパティが適用されます。検索機能は、ユーザーが設定したフィルターに必要です。

このアプローチを例によるクエリに置き換えたいと思います。ここでは、目的のパラメーターを使用してオブジェクト グラフを作成するだけです。Hibernate docs に従おうとした私の試みは失敗し、この質問で説明されています。

私が達成しようとしていることを機能する方法で実証し、同等のものを探すことが役立つかもしれないと考えました。そのため、質問を再質問しています。

要するに、私の質問は次のとおりです。Hibernate で上記の Criteria Query を Query by Example としてどのように実装しますか? 私は休止状態 3.6.6 を使用しています。

ありがとう!

4

1 に答える 1

6

次のようなことをしたいとします。

Select a.* , b* 
from a join b on a.id = b.id 
where a.property1 = "wwww"
and a.property2="xxxx"
and b.property1="yyyy"
and b.property2="zzzz"

Query by Example(QBE)を使用して上記のクエリを実装するには、次のようにします。

/***Initialize an instance of Class A with the properties that you want to match***/
A instanceA = new A();
instanceA.setProperty1("wwww");
instanceA.setProperty2("xxxx"); 
Example exampleA = Example.create(instanceA);

/***Do the same for the Class B**/
B instanceB = new B();
instanceB.setProperty1("yyyy");
instanceB.setProperty2("zzzz"); 
Example exampleB = Example.create(instanceB);

/**Create and execute the QBE***/
List<A> results = session.createCriteria(A.class)
    .add(exampleA)
    .createCriteria("b",CriteriaSpecification.LEFT_JOIN) // b is the property of Class A
    .add(exampleB)
    .list();

結果はすでにフェッチ結合されています。つまり、AのコレクションインスタンスBはすでに完全に初期化されています。

于 2011-11-23T16:52:42.213 に答える