2011-03-24 8 views
1

申し訳ありませんが、それはばかな質問ですが、私は、全体の午後のために、この問題にこだわってきましたが、私は複雑なSQLと熟練していないよので、解決策を見つけることができない場合:HibernateはgroupPropertyを選択し、rowCountはrowCount> nですか?

私は "上位n message-を見つけたいですMSG送信され、カウント>しきい値でテーブルからユーザーを送信する「これが私の基準です:

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 、 私は試した 。私は今私の目標を達成するためにサブクエリを使用することができますが、生成されたクエリはでありませんので、巧妙で

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を参照してください。このような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を使用する方がはるかに簡単そうですが、私は基準の方法について興味があります)

答えて

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")

+0

こんにちは、私は試みましたが、それほど賢明ではないSQLクエリを得ました。あなたはもう一度それを見てみませんか?ありがとう。 – smallufo

+0

sqlでは不可能な何かをhibernateで行うことはできません。 SQLのwhere句で集計変数を使用することはできません(少なくとも私が知っているデータベースではない)、これは休止状態では実行できません。上記のSQLが動作している場合、使用しているDBを教えてください。 –

+0

ありがとうございます、そうです、それは動作しません。 – smallufo

関連する問題