1

珍しいことではないと確信しているので、これは非常に簡単な答えかもしれません。同様の質問がいくつかありますが、私の問題を説明しているようには見えません。

車と人の2つのオブジェクトがあります。彼らは多対多の関係にあります。つまり、車は複数の人が所有でき、人は複数の車を所有できます。 Car怠惰に初期化された:のセットがありDriversます

@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY)
private Set<Person> people;

25歳未満の所有者がいるすべての青い車を見つけたい:

Criteria foo = persistenceManager.createCriteria(Car.class, "myCarAlias");
Criteria bar = foo.createCriteria("drivers", "myDriverAlias");
//add restrictions on foo and bar for blue and age, respectively
baz = foo.list();

私の問題は、リストを繰り返してgetDrivers()各車を呼び出すと、コレクションが初期化され、その車のすべてのドライバーが取得されることです。私.list()が走ったのは各車の結果を設定していないと思います。

SQL hibernateが生成しているものを手動で実行した場合に期待する結果が返されるので、基準が問題ではないと合理的に確信しています。

なぜこれが発生するのかは理解できますが、各車を繰り返し処理し、各車のドライバーのクエリを実行せずに回避する方法がわかりません。できればそうしないようにしたいと思いますので、アドバイスをいただければ幸いです。

前もって感謝します!

4

2 に答える 2

3

各車のドライバーコレクションに、基準に一致する(つまり、25歳以上の)人だけが含まれることを望んでいましたか?つまり、25歳以上のユーザーを含むDriversコレクションは必要ありませんか?

その場合、Hibernateは結果を返す前にコレクションを事前にフィルタリングしないため、ResultTransformer(Hibernateドキュメントのセクション15.4を参照)を使用する必要があります。

ただし、問題がDriversコレクションの遅延読み込みであり、それが望ましくない場合は、フェッチモードを設定すると(IIRC FetchMode.EAGERが非推奨になったため、通常はJOINを使用します)、問題を解決できます。

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();
于 2010-10-05T05:29:01.317 に答える
1

Hibernateドキュメントのセクション15.5。基本的に、条件クエリのフェッチストラテジーを設定できます。これは、リレーションシップに対して定義した基本的なフェッチストラテジーよりも優先されます。

ドキュメントからの例

List cats = sess.createCriteria(Cat.class)
   .add( Restrictions.like("name", "Fritz%") )
   .setFetchMode("mate", FetchMode.EAGER)
   .setFetchMode("kittens", FetchMode.EAGER)
   .list();

およびドキュメント http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

于 2010-10-04T17:33:23.790 に答える