Hibernate выберите groupProperty, rowCount с rowCount> n? - PullRequest
1 голос
/ 24 марта 2011

Извините, если это глупый вопрос, но я застрял с этой проблемой целый день, но не могу найти решение, потому что я не разбираюсь в сложном SQL:

Я хочу найти " Top 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, но мне любопытно, как работает критерий)

1 Ответ

2 голосов
/ 24 марта 2011

Вам понадобится дополнительный подзапрос, такой как:

    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 <ваши основные критерии, поэтому вам нужно будет создать эти критерии с псевдонимом <code>createCriteria(MEssage.class, "alias")

...