class Order{
int id;
String description;
//one to one eager load with join column specified
Detail details;
//one to many lazy load with mapped by specified
Collection<Item> items;
}
class Detail{
}
class Item{
String name;
//reference to order
}
簡単なエンティティモデル、次の点を考慮それでは、要件がいくつかの基準によりアイテムの詳細ですべての注文をロードすることであるとしましょう(例:説明と一致するもの)。シンプルな、私は "どこから説明するのか..."のようなhqlを書く。たとえば、1000個のエンティティがロードされ、アイテムのコレクションが遅延ロードされます。私はサイズを呼び出すことによってセッション内で強制的にロードします。私はアイテムのためのバッチフェッチを使用することにしましたので、当然の
これはN + 1つの問題につながりました。バッチサイズの注釈をアイテムコレクションに追加し、予想よりもはるかに少ないクエリを追加しました。
しかし、私はすべての「詳細」に興味を持っていないですが、それは1つの熱心な負荷に1であるため、常にこれをロードするためにつき1つのクエリがあります。私は単にこれらのクエリを取り除きたいだけです。
これを解決するために、私は細かいことなく選択をしようとしますが、アイテム(コレクション)をクエリに含める方法がわからないので、すべてを選択した場合とまったく同じ方法でロードされます遅延ロードされ、その後の呼び出しでバッチサイズを利用することができます)。いくつかの提案は、where句でjoinを使うことですが、空の配列リスト(Lazyローディングの場合のようにPersistentBagではなく)でコレクションを初期化します。
解決策をお探しですか?
'Detail'を遅延ロードしないのはなぜですか? – ujulu
デフォルト(熱心な)読み込みに依存するアプリケーションの他の部分があります。さらに、1-1を遅延ロードにするためのすべてのソリューションは(バイトコードの計測など)簡単であり、既存のコードを壊すリスクを冒したくありません。 – smi