2

複数のテーブルが基準に結合した後にページネーションをしたい。

問題は次のとおりです。

テーブルを結合したときに生成された重複レコード。 レコード セットに適用されるページネーション (重複あり)。

私はこのcriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);を使用します。重複したレコードを削除します。

例: 通常、重複の削除を適用した後、10 件のレコードを取得しました。開始インデックスを 1 に設定し、終了インデックスを 5 に設定すると、5 つのレコードが取得されるはずですが、2 または 3(およそ) が返されます。加入次第です。

私を助けてください。

4

2 に答える 2

1

ここでの問題は、適用されている 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

  1. DBサーバーで5行を受け取り、
  2. これは、アプリケーション レベルで 3 つの異なる親オブジェクトにのみ変換されます
于 2013-10-25T02:46:47.077 に答える
0

私はここでこれに答えました: Hibernate Criteria と DISTINCT_ROOT_ENTITY によるページネーション

1) 合計数を取得する、2) 必要な行の ID を取得する、3) ステップ 2 で見つかった ID のデータを取得する、という 3 つのことを行う必要があります。順序は正しく、ジェネリック メソッドを作成し、切り離された基準オブジェクトを送信して、より抽象化することもできます。

于 2014-05-12T20:30:50.577 に答える