SetFirstResult と SetMaxResults を使用するときに、ResultTransformer を使用せずに個別の結果セットを取得する方法をご存知ですか?
-
23-08-2019 - |
質問
SetFirstResult と SetMaxResult を使用し、クエリが結合している場合、結果は一意ではなく重複した結果になります。
次に、基準 API にすべての種類の Distinct ヘルパーを使用します。ただし、結果セット全体をフィルタリングするのではなく、ページングされた結果をフィルタリングするだけです。
どうすればこの問題を克服できますか?
ありがとう
解決
私はに、この問題を克服するためのハック事を発見しました。
このための唯一の「回避策」という 私はしている思い付くことができました 基準からの2つのクエリを発行 同じ基準オブジェクト。最初の1つ IDのもう一つはあります IDにcontrained。
あなたが望むように// crtieriaを設定し、 含むページネーションmyCriteria = doStuffToSetupCriteria(); myCriteria.setFirstResult((ページ-1)* itemsPerPage)。 myCriteria.setMaxResults(itemsPerPage);
主キー場合は、//リストを取得 myCriteria.setProjection(Projections.distinct(Projections.property( "myAllias.id")); リストID = gacc.list();
//今にidを追加 制限 myCriteria.add(Restrictions.in( "myAlias.id、 IDS));
//最後critiera実行からクリーンアップ gacc.setProjection(NULL)。 gacc.setFirstResult(0)。 gacc.setMaxResults(Integer.MAX_VALUEの)
//検索結果リストのオブジェクト= gacc.list()
私は同意少しハックが、唯一の 私は与えられた見つけることができる許容soltion このlimitiationます。
他のヒント
私も同様のソリューションを構築しましたが、DB への 1 回のアクセスだけで済みました。
DetachedCriteria subQuery = ...//-->「SetFirstResult」と「SetMaxResults」を含む必要なすべての基準を追加します
DetachedCriteria rootQuery = DetachedCriteria.For();// ここで、T はエンティティです
subQuery.SetProjection( projections.distinct(projections.projectionList()。add(projections.alias(projections.property( "id")、 "id"))))) );
// 注記:私のすべてのエンティティは、プロパティ「ID」rootquery.Add(subqueries.propertyin( "id"、subquery))を含む基本クラスから継承します。
// ...rootQuery を使用して T のリストを取得すると、繰り返し項目は取得されません。
誰かがこの実装が役立つことを願っています:)
ローマ語