3

SetFirstResult と SetMaxResult を使用し、クエリに結合がある場合、結果は一意ではなく重複します。

次に、すべてのタイプの Distinct ヘルパーを基準 API に使用します。ただし、結果セット全体をフィルタリングするのではなく、ページングされた結果をフィルタリングするだけです。

どうすればこの問題を克服できますか?

ありがとう

4

2 に答える 2

4

この問題を克服するためのハッキーなものを見つけました。

私が思いついた唯一の「回避策」は、基準と同じ基準オブジェクトから 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()

私は同意しますが、この制限を考えると、私が見つけることができる唯一の許容できる解決策です。

于 2009-02-13T14:21:59.583 に答える
1

私は同様のソリューションを構築しましたが、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のリストを取得すると、繰り返されるアイテムは取得されません。

誰かがこの実装がお役に立てば幸いです:)

ロマン

于 2009-07-16T20:08:11.580 に答える