Java spring+休眠一对多计数行

Java spring+休眠一对多计数行,java,sql,spring,hibernate,orm,Java,Sql,Spring,Hibernate,Orm,在hibernate中,Post和Comment实体之间存在一对多关系。一篇文章可以有很多评论发表1-N条评论,因此评论保留了Post_id的外键。问题是,当我为我的控制器获取帖子列表时,我还希望在每篇文章中包含分配给该文章的评论数。因此,如果有一些帖子列表,我想附上该帖子下面评论的数据编号 我已经创建了PostWithCommentsOnTo,它带有额外的字段,可以容纳大量的评论,我已经完成了转换器等 但是,我应该在哪里以及如何获取评论的数量,我如何才能真正做到这一点 整个建筑是这样的 控制器

在hibernate中,Post和Comment实体之间存在一对多关系。一篇文章可以有很多评论发表1-N条评论,因此评论保留了Post_id的外键。问题是,当我为我的控制器获取帖子列表时,我还希望在每篇文章中包含分配给该文章的评论数。因此,如果有一些帖子列表,我想附上该帖子下面评论的数据编号

我已经创建了PostWithCommentsOnTo,它带有额外的字段,可以容纳大量的评论,我已经完成了转换器等

但是,我应该在哪里以及如何获取评论的数量,我如何才能真正做到这一点

整个建筑是这样的 控制器-PostWithCommentScontTo-PostService-PostRepository-Post 控制器-CommentDTO-CommentService-CommentRepository-Comment

请阅读第15.6点 您可以使用PostWithCommentScondTo的所有字段创建构造函数。之后,您可以在HQL查询中使用它,正如我添加的链接中所述。在您的查询中,您可以通过“Post\u id”加入帖子和评论,通过“Post\u id”将它们分组,并在select语句中使用countpost\u id。 因此,您的查询将如下所示:

select new PostWithCommentsCountDTO (p.id, /and all other fields.../ , count(post_id)) from Post as p left join Comments as c on p.id=c.post_id where /some where statement if needed .../ group by c.post_id
这意味着您可以在存储库级别收集DTO:

public List<PostWithCommentsCountDTO> getWithCommentsCount(...){
     return (List<PostWithCommentsCountDTO>) getSession().createQuery(...).setParameter(...).list();
}

请提供足够的信息以帮助其他人重现问题,包括任何相关代码。请参阅此以获取帮助:从存储库返回dto不是一种糟糕的做法吗,因为我听说您必须返回实体?@rickmariarty用于诸如getAll之类的常规方法,getById。。。和它们类似,你应该返回实体,但对于某些特定的方法,您不需要表中的所有数据就可以更好地使用DTO。@例如,Rickmoriarty,您需要从一些订单表中选择所有产品名称及其计数。如果您从DB获得所有订单,并将其分组到服务层,则必须从DB获得大量不需要的数据,这会增加您的流量和时间方法执行。若你们的数据库和你们的应用程序不在同一台机器上,那个么你们的应用程序的执行时间会变长,应用程序的运行速度也会变慢。但是你可以做简单的“分组…”还有‘伯爵……’在数据库服务器中,只从数据库中获取聚合数据,这将加快工作速度,减少应用程序和数据库之间的通信量。@Rickmoriarty这使此解决方案从存储库级别返回的DTO更加优化,并可能减少将来在您的请求期间有人更新数据库时出现的错误数量。总之:对于一般的getting方法,最好从存储库返回实体,但对于特定的计算或聚合方法,最好从存储库返回预先计算的DTO