SetFirstResult と SetMaxResult を使用し、クエリに結合がある場合、結果は一意ではなく重複します。
次に、すべてのタイプの Distinct ヘルパーを基準 API に使用します。ただし、結果セット全体をフィルタリングするのではなく、ページングされた結果をフィルタリングするだけです。
どうすればこの問題を克服できますか?
ありがとう
SetFirstResult と SetMaxResult を使用し、クエリに結合がある場合、結果は一意ではなく重複します。
次に、すべてのタイプの Distinct ヘルパーを基準 API に使用します。ただし、結果セット全体をフィルタリングするのではなく、ページングされた結果をフィルタリングするだけです。
どうすればこの問題を克服できますか?
ありがとう
この問題を克服するためのハッキーなものを見つけました。
私が思いついた唯一の「回避策」は、基準と同じ基準オブジェクトから 2 つのクエリを発行することです。最初のものはIDを取得し、2番目のものはIDに制限されています。
//ページネーションを含め、必要に応じて基準を設定します myCriteria = doStuffToSetupCriteria(); myCriteria.setFirstResult((page-1)*itemsPerPage); myCriteria.setMaxResults(itemsPerPage);
//主キーの場合はリストを取得 myCriteria.setProjection(Projections.distinct(Projections.property("myAllias.id")); List ids = gacc.list();
// ID を制限に追加します myCriteria.add(Restrictions.in("myAlias.id, ids));
//最後の基準 run gacc.setProjection(null); からクリーンアップします。gacc.setFirstResult(0); gacc.setMaxResults(Integer.MAX_VALUE);
//結果 List objects = gacc.list()
私は同意しますが、この制限を考えると、私が見つけることができる唯一の許容できる解決策です。
私は同様のソリューションを構築しましたが、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のリストを取得すると、繰り返されるアイテムは取得されません。
誰かがこの実装がお役に立てば幸いです:)
ロマン