結合フェッチを使用して次のクエリを実行すると、製品とともに色が読み込まれます。
select distinct product from Product product
left join fetch product.colors color
where ...
HQL は、Hibernate のドキュメントで詳しく説明されています。
「フェッチ」結合を使用すると、値の関連付けまたはコレクションを、単一の選択を使用して親オブジェクトとともに初期化できます。これは、コレクションの場合に特に役立ちます。アソシエーションとコレクションのマッピング ファイルの外部結合と遅延宣言を効果的にオーバーライドします。
基準でそれを行うことは似ています (もっと退屈です: where 句が本当に動的である場合にのみそれを行います):
Criteria c = session.createCriteria(Product.class, "product");
c.setFetchMode("product.colors", FetchMode.JOIN);
c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
c.add(...);
ドキュメントの関連部分は次のとおりです。
setFetchMode() を使用して、実行時に関連フェッチ セマンティクスを指定できます。
あなたはすでにここで Hibernate に関する多くの質問をしています。なぜドキュメントを読まないのですか?
編集:
コメントから、あなたはやりたいことをする方法を知っているように見えますが、最大数の結果を適用するのに問題があるようです.
この問題の最も簡単な解決策は、5000 に制限された最初のクエリを実行して、製品の ID のみをロードすることです。次に、最初のクエリによって取得された一連の ID に含まれる ID を持つ製品とその色をロードする、限定されない 2 番目のクエリを実行します。
select product.id from Product product where ...
select distinct product from Product product
left join fetch product.colors color
where product.id in (:productIds)
一部のデータベース (Oracle など) では、句に入れることができる要素の数が制限されていることに注意してください (Oracle ではIN
最大 1000 要素)。したがって、5000 個の ID のセットを 1000 個の要素のセットに分割し、この分割ごとにクエリを実行する必要がある場合があります。