5

次のように、3 つのエンティティとそれらのネストされたコレクションがあります。エンティティ A には B のコレクションが含まれ、エンティティ B には C のコレクションが含まれます。

そして、エンティティ A の完全なオブジェクト グラフのリストをフェッチする必要があります。B のコレクションと C のコレクションの両方に対してフェッチ戦略を「サブセレクト」に設定すると、実際には B のコレクションのみが単一のクエリで読み取られます。C の各コレクションは、タイプ B のエンティティごとに個別のクエリを介して読み取られます。これは、フェッチ戦略がそこで「選択」された場合と同じです。

だから私は次のことを期待しています:

Aから~を選ぶ
select ... from B where a_id in (select id from A)
select ... from C where b_id in (select id from B where a_id in (select id from A))

しかし、実際には次のようになります。

Aから~を選ぶ
select ... from B where a_id in (select id from A)
select ... from C どこで b_id = ?
select ... from C どこで b_id = ?
...
select ... from C どこで b_id = ?

ネストされた副選択に制限はありますか?

4

1 に答える 1

0

問題が特定されました。データベースにマップされたエンティティには、コレクションを含むすべての内部メンバーの値に基づいてハッシュ コードを計算する getHashCode() のカスタム実装があります。Hibernate がエンティティ B の getHashCode() を呼び出すと、コレクション C はまだ読み込まれていませんが、ハッシュを取得するために必要です。そのため、別のクエリを実行して、現在のオブジェクト B の C のコレクションを取得します...

于 2012-10-06T20:27:06.817 に答える