私はGiftというテーブルを持っています。これはClickThroughというテーブルと1対多の関係にあります。これはその特定のGiftがクリックされた回数を示します。 ClickThroughカウント順に並べられたすべてのGiftオブジェクトをクエリする必要があります。 ClickThroughカウントを返す必要はありません。何もする必要がないので、注文の目的で使用したいだけです。
ClickThroughカウント順に並べられたGiftオブジェクトのリストを直接返すクエリが必要です。 Criteria APIを使用してこれを行うにはどうすればよいですか?これに似た情報についてはたくさんのドキュメントを見つけることができますが、私が必要としているものとまったく同じものはありません。
エンティティまたはプロパティのリストをカウントと組み合わせて返したい場合は、groupbyが必要になります。基準では、これはProjectionList
およびProjections
を介して行われます。例えば.
final ProjectionList props = Projections.projectionList();
props.add(Projections.groupProperty("giftID"));
props.add(Projections.groupProperty("giftName"));
props.add(Projections.count("giftID"), "count"); //create an alias for the count
crit.setProjection(props);
crit.add(Order.desc("count")); //use the count alias to order by
ただし、ProjectionList
を使用しているため、 AliasToBeanConstructorResultTransformer も使用する必要があります。
プロパティ/列で注文しようとしている他の人への注意:
ここに記載されているアプローチを使用した場合、結果は見つかりませんでした。修正は、代わりにcriteria.addOrder(Order.asc(property));
を使用することでした。違いは、addOrder
ではなくadd
を使用することです。
クイックリファレンスのためにここを実行した後、この問題が数回発生しました。
あなたはGiftからClickThroughまで1対多の関係にあるので、各ClickThroughは、日時またはその他の情報が関連付けられたレコードであると思います。この場合、マッピングファイルに「カウント」フィールドを追加し、基準に順序を添付します。
criterion.add(Order.asc(count)))
マッピングプロパティは次のようになります。
<property name="count" type="integer" formula="(select count(*) from Gift g inner join ClickThrough ct on ct.gift_id=g.id where g.id=ID)"/>
マッピングファイルを変更できない、または変更したくない場合は、Collections.sort()
をComparator
とともに使用できますが、DBから大量のデータを返す必要があると効率が低下するようです。