Критерии подсчета количества детей в спячке - PullRequest
2 голосов
/ 23 ноября 2010

У меня есть отношения родитель / дети: newsItem 1- * comment.

Как выбрать список элементов новостей, а также количество комментариев для каждого элемента новостей, используя один запрос Criteria?

Я хочу сделать что-то вроде этого:

select news_item.*, count(comment.id) from news_item left join comment on comment.news_item_id = news_item.id group by news_item.id

Результатом должен быть список объектов [2] {newsItem, int}.

Может ли это быть достигнуто с помощью запросов Criteria?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 23 ноября 2010

Ну, я нашел решение.Надеюсь, это кому-нибудь поможет:

Criteria criteria = session.createCriteria(NewsItem.class);

criteria.createAlias(NewsItem.COMMENTS, NewsItem.COMMENTS, Criteria.LEFT_JOIN);

ProjectionList properties = Projections.projectionList();
properties.add(Projections.groupProperty(NewsItem.ID).as(NewsItem.ID));
properties.add(Projections.property(NewsItem.DATE).as(NewsItem.DATE));
properties.add(Projections.property(NewsItem.NAME).as(NewsItem.NAME));
properties.add(Projections.property(NewsItem.PREVIEW).as(NewsItem.PREVIEW));
properties.add(Projections.property(NewsItem.IMAGE).as(NewsItem.IMAGE));
properties.add(Projections.count(NewsItem.COMMENTS + "." + Comment.ID).as(NewsItem.COMMENTS_COUNT));
criteria.setProjection(properties);
criteria.setResultTransformer(Transformers.aliasToBean(NewsItem.class));

Вы также должны добавить виртуальное свойство COMMENTS_COUNT (Long) в класс NewsItem.

1 голос
/ 02 февраля 2012

Вы можете использовать что-то вроде этого:

Criteria criteria = session.createCriteria(NewsItem.class,"newItem")
         .createAlias(NewsItem.COMMENTS, "comments", Criteria.LEFT_JOIN)
         .setProjection(Projections.projectionList().add(
            Projections.alias(Projections.count("comments.id"), "commentsCount")).add(
            Projections.alias(Projections.groupProperty("newItem.id"), "newItem")))
        .setResultTransformer(Transformers.aliasToBean(NewItemCommentsGroupBy.class));

Убедитесь, что класс NewItemCommentsGroupBy выглядит примерно так:

class NewItemCommentsGroupBy{
    long commentsCount;
    NewsItem newsItem;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...