質問

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

車と人の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が生成しているSQLを手動で実行すると予想される結果を取り戻すため、基準が問題ではないと確信しています。

なぜこれが起こるのかはわかりませんが、各車を反復したり、それぞれのドライバーのクエリを実行せずにそれを回避する方法がわかりません。可能であればそれを避けたいと思いますし、アドバイスに感謝します。

前もって感謝します!

役に立ちましたか?

解決

各車のドライバーコレクションには、あなたの基準に合った人のみが含まれることを望んでいましたか(つまり、25歳以上)。言い換えれば、25歳以上の人を含むドライバーコレクションを望んでいませんか?

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

ただし、問題がドライバーコレクションが怠zyであり、それが望ましくない場合、それは望ましくない場合、フェッチモードを設定します(通常、IIRC fetchmode.eagerが非推奨なのでJoinを使用します)。問題は解決するはずです。

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();

他のヒント

冬眠文書のセクション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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top