JPA Group by 具有多个字段
Posted
技术标签:
【中文标题】JPA Group by 具有多个字段【英文标题】:JPA Group by with multiple field 【发布时间】:2016-11-12 06:36:43 【问题描述】:我在使用命名查询 blog.findBlogs 时遇到以下错误
“您的 select 和 having 子句必须只包含也出现在您的分组子句中的聚合或值。”
在 select 子句中,我使用了 b.id,因此它必须允许无错误地执行此查询。我还尝试了来自 mysql workbench 的相同查询,它工作得很好。
@NamedQueries( value =
@NamedQuery (name = "blog.findBlogs", query = "SELECT " +
"NEW com.vo.Blog(b.id, b.blogId, b.createDate, b.tags, b.url, COUNT(r.emotion)) " +
"FROM Blog b JOIN b.rates r " +
"GROUP BY b.id")
)
问候,阿米特·J。
【问题讨论】:
【参考方案1】:一般来说,SQL 中的GROUP BY
查询必须遵守一条规则,即出现在SELECT
子句中的所有内容都必须出现在GROUP BY
子句中或位于聚合函数中,例如COUNT
。
我也尝试了 mysql workbench 的相同查询,它工作得非常好。
事实证明,MySQL 是少数不执行此规则的数据库之一。但是 JPA 似乎不允许这样做,因此即使底层数据库是 MySQL 的松散版本,从 JPA 运行它也会失败。
您可以通过以下方式修改代码以使其正常运行:
@NamedQueries( value =
@NamedQuery (name = "blog.findBlogs", query = "SELECT " +
"NEW com.vo.Blog(b.id, COUNT(r.emotion)) " +
"FROM Blog b JOIN b.rates r " +
"GROUP BY b.id")
)
如果您想知道原始查询的逻辑问题是什么,那就是,对于给定的 b.id
值,JPA 无法确定 哪个 博客、日期和标签值为该组选择。
【讨论】:
感谢您的回复。在 select 子句中,我对其他领域以及 Id 感兴趣。 您的要求毫无意义。 您还想要其他哪些值?您需要提供逻辑来确定您为每个 id 组保留的值。 它看起来像 group by 应该更改为 b.id, b.blogId, b.createDate, b.tags, b.url 而不是只有 b.id 基本上我想填充博客 VO其评级来自 Rate 实体。博客可以由多个用户评分 不一定。如果你这样做,计数可能不是你想要的。 你能建议我如何实现它吗?我有两个实体类 Blog 和 Rate 具有一对多的关系(一个博客可以被不同的用户多次评价)。我想说一下,例如10 个博客,但在填充博客的 VO 时,我也有兴趣从 Rate 表中获取每个博客的聚合值(如平均评分、总喜欢/不喜欢等)。以上是关于JPA Group by 具有多个字段的主要内容,如果未能解决你的问题,请参考以下文章