ここでの問題は、適用されている 2 つの異なる手法にあります。
- まず、DB サーバーに正しく適用されたページネーションがあります。意図した行数 (5 など) を返します。
- 2 番目の部分はアプリケーション部分で、Hibernate がこれら 5 つのレコードから DISTINCT 値を選択します。
したがって、実際に 2 つの行が 2 倍になり、さらに 1 つの行がある場合、変換の結果は 3 つのオブジェクトになります。
それを回避するための正しい(そしておそらく最良の)方法は、コレクションのフェッチを使用しないことです。コレクションを表示する必要がある場合は、遅延ロードする必要があります (たとえば、選択の数を減らすためにバッチサイズを使用します)。
コレクションをフィルターとして使用する必要がある場合は、コレクションを に変換subquery
し、IN (サブクエリ) 句を使用して、ルート エンティティで再度ページ付けを行う必要があります。
これを想像してください、親テーブル:
ParentId, Code
1 , 'P1'
2 , 'P2'
3 , 'P3'
子テーブル:
ChildId , Code , ParentId
1 , 'C1' , 1
2 , 'C2' , 1
3 , 'C3' , 2
4 , 'C4' , 2
5 , 'C5' , 3
を要求し、コレクションにParent
も参加する場合は、Child
- DBサーバーで5行を受け取り、
- これは、アプリケーション レベルで 3 つの異なる親オブジェクトにのみ変換されます