ばかげた質問である場合は申し訳ありませんが、私はこの問題を午後中ずっと続けていますが、複雑なSQLに精通していないため、解決策を見つけることができません。
「メッセージ送信数>しきい値のテーブルから上位n件のメッセージ送信ユーザー」を見つけたいのですが、これが私の基準です:
Criteria c = session.createCriteria(Message.class);
ProjectionList plist = Projections.projectionList();
plist.add(Projections.groupProperty("user"));
plist.add(Projections.rowCount() , "count");
c.setProjection(plist);
c.addOrder(Order.desc("count"));
c.setFirstResult(0);
c.setMaxResults(count);
これは私が書くことができるものですが、「rowCountがしきい値よりも低い行をフィルタリングする」ことはできません。基準でそれを実装する方法は?どうもありがとう !
- - - - - - - 更新しました - - - - - - - - - - - -
ありがとう@TheStijn、私は試しました。これで、サブクエリを使用して目標を達成できますが、生成されたクエリはそれほど賢くありません。生成されたSQLを参照してください:
select
this_.fromUser as y0_,
count(*) as y1_
from
Message this_
where
this_.fromUser is not null
and this_.created>?
and this_.created<?
and ? <= (
select
count(*) as y0_
from
Message msg_
where
msg_.fromUser=this_.fromUser
and msg_.fromUser is not null
and msg_.created>?
and msg_.created<?
)
group by
this_.fromUser
order by
y1_ desc limit ?
つまり、サブクエリはメインクエリのほとんどを繰り返しますが、これは少し冗長だと思います。そのようなSQLクエリを構築する基準はありますか?
select
this_.fromUser as y0_,
count(*) as y1_
from
Message this_
where
this_.fromUser is not null
and this_.created>?
and this_.created<?
and y1_ > ? // threshold
group by
this_.fromUser
order by
y1_ desc limit ?
どうもありがとう !
(これを行うにはHQLを使用する方がはるかに簡単なようですが、Criteriaの方法に興味があります)