2010-11-23 4 views
2

У меня родитель/дети отношения: newsItem 1- * комментарий.Hibernate дети подсчет критериев

Как я могу выбрать список newsItems, а также количество комментариев для каждого newsItem, используя один запрос 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] {статьи новостей, Int}.

Это может быть выполнено с помощью запросов Criteria?

Спасибо!

ответ

3

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

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) в классе статьи новостей.

+0

Каким virutal свойство выглядит? – 2016-07-25 13:04:52

1

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

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; 
} 
+0

Я не думаю, что это было бы хорошим решением для введения дополнительных объектов для каждого индивидуального случая. – 2013-02-27 12:09:41