0

Fooと多対多の関係を持つエンティティ クラスがあります。Bar

...
<class name="Foo">
    ...
    <set name="bars" table="FooBar" lazy="true" batch-size="100" fetch="select">
        <key column="FooID" />
        <many-to-many column="BarID" class="Bar" />
    </set>
    ...
</class>
...

Fooユーザーが特定の に添付されているすべての を検索できる検索画面を作成しようとしていますBarBarそれぞれに添付されたすべてのFooが検索結果に表示されます。

だから私はこのコードを試しました:

criteria.createAlias("bars", "bar", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.eq("bar.id", barID));

これにより、レコードが適切にフィルタリングされFooます。ただし、プロパティもフィルタリングしbarsます。だから私はこの行を追加しました:

criteria.setFetchMode("bars", FetchMode.SELECT)

しかし、それは何もしませんでした。

休止状態セッションのバーに休止状態フィルターがありません。誰でも私を助けることができますか?

4

2 に答える 2

0

コレクションアイテムにフィルターがある場合、コレクションは初期化されず、後でアクセス時に遅延フェッチされます。たぶんHibernateはbarとbarIdを一致させることができません。試す

criteria.createAlias("bars", "bar", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.eq("bar.id", barID));
于 2012-09-19T11:46:02.940 に答える
0

Fooトム、特定の に添付されたを返したいのでBar、左結合を使用する必要はありません。内部結合を使用すると、Bars は N+1 の選択 (フィルター処理された s を取得するために1 つの選択を選択し、その s を取得するために返されるFooごとに 1 つの選択) を介してフェッチされます。FooBar

上記のコードと非常によく似たコードがあり、左の結合ではBars コレクションが最初の結果セットから強制的に読み込まれるのに対し、内部の結合では N+1 の選択が使用されることに気付きました。また、フェッチモードを指定してみましたが、効果がありませんでした。私の場合、左結合を必要とするフィルターを使用しているため、内部結合を使用できません。例えば:

criteria.add(Restrictions.not(Restrictions.ilike("bar.name", "FizzBuzz")));

その場合、"FizzBu​​zz" という名前の no がないため、 のない を返す必要がありますが、内部結合を使用すると、 のないものはすべて削除FooBarれます。まだ左結合を使用しているトムの質問に対する別の回答を他の誰かが提供できれば、それは大歓迎です!BarFooBar

編集:「制限を追加するために createCriteria と組み合わせると、criteria.setFetchMode が無視される」という Hibernate のバグ レポートを見つけました。

https://hibernate.onjira.com/browse/HHH-3524

于 2012-10-10T22:10:49.717 に答える