2010-11-23 6 views
2

J'ai une relation parent/enfant: newsItem 1- * comment.Les enfants Hibernate comptent les critères

Comment puis-je sélectionner une liste d'articles de presse et également le nombre de commentaires pour chaque article d'information en utilisant une requête de critères?

Je veux faire quelque chose comme ceci:

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 

Le résultat devrait être la liste des objets [2] {NewsItem, int}.

Cela peut-il être accompli avec des requêtes de critères?

Merci!

Répondre

3

Eh bien, j'ai trouvé une solution. Il aide quelqu'un l'espoir:

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

Vous devriez également ajouter un COMMENTS_COUNT de propriété virtuelle (Long) à la classe NewsItem.

+0

Comment une propriété virutal ressemble? –

1

Vous pouvez utiliser quelque chose comme ceci:

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

Assurez-vous que la classe NewItemCommentsGroupBy est quelque chose comme ceci:

class NewItemCommentsGroupBy{ 
    long commentsCount; 
    NewsItem newsItem; 
} 
+0

Je ne pense pas que ce serait une bonne solution d'introduire des entités supplémentaires pour chaque cas personnalisé. –