2011-03-24 75 views
1

很抱歉,如果這是一個愚蠢的問題,但我堅持這個問題了整整一個下午,但無法找到一個解決方案,因爲我不熟悉複雜的SQL:Hibernate選擇groupProperty,rowCount與rowCount> n?

我想找到「前n個MESSAGE-用味精發送計數>閾發送用戶從表「這是我的準則:

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要做到這一點,但我對標準的方式好奇)

回答

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 2011-03-24 15:01:18

+0

你不能在SQL中做一些不可能的事情。由於你不能在sql中的where子句中使用聚合變量(不是在我知道的任何數據庫中),所以你不能在休眠中使用)。如果你的上面的sql正在工作,請告訴我你正在使用哪個數據庫。 – 2011-03-24 15:32:25

+0

謝謝,你是對的,它不起作用。 – smallufo 2011-03-25 03:38:45