1

ばかげた質問である場合は申し訳ありませんが、私はこの問題を午後中ずっと続けていますが、複雑な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の方法に興味があります)

4

1 に答える 1

2

次のような追加のサブクエリが必要になります。

    DetachedCriteria subQuery = DetachedCriteria.forClass(Message.class, "msg");
    subQuery.add(Restrictions.eqProperty("msg.user", "mainQuerymsg.user"));
    subQueryEntriesCount.setProjection(Projections.rowCount());

    c.add(Subqueries.lt(1L, subQuery));

mainQuerymsg <メインの基準なので、エイリアスを使用してこれらの基準を作成する必要がありますcreateCriteria(MEssage.class, "alias")

于 2011-03-24T13:49:14.010 に答える