Hibernateは、N + 1クエリの問題を回避するための(少なくとも)2つのオプションを提供します。1つは、FetchModeをSubselectに設定することです。これにより、IN句を含むselectと、このIN句内のsubselectが生成されます。もう1つは、BatchSizeを指定することです。これにより、親のIDを含むIN句を使用してselectが生成されます。
どちらも機能しますが、親のクエリが複雑なため、[サブ選択]オプションでパフォーマンスの問題が発生することがよくあります。一方、BatchSizeが大きい場合(たとえば1000)、クエリの数とそれらのクエリの複雑さは非常に小さくなります。
したがって、私の質問は、BatchSizeではなくHibernateのSubselectFetchModeをいつ使用するのかということです。親エントリの数が非常に多い場合(数千)、副選択はおそらく意味がありますが、BatchSizeよりも副選択を使用したいシナリオは他にありますか?
編集:熱心な読み込みを処理するときに、2つの違いに気づきました。xToManyアソシエーションを熱心にロードし、サブセレクトを介してロードするように設定している場合、レイジーの場合と同じようにサブセレクトが生成されます。ただし、BatchSizeを指定すると、生成されたクエリは、個別のクエリではなく外部結合を使用します。熱心にロードするときにHibernateに個別のバッチクエリを使用させる方法はありますか?