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 具有多个字段的主要内容,如果未能解决你的问题,请参考以下文章

JPA标准GROUP BY子句

group by 后面可以带两个字段吗

mysql 可以group by 两个字段吗

group by两个分组字段的查询

group by 多个字段

SQL group by 后查某字段最大值