仅休眠错误:“列必须出现在 GROUP BY 子句中或在聚合函数中使用”

Posted

技术标签:

【中文标题】仅休眠错误:“列必须出现在 GROUP BY 子句中或在聚合函数中使用”【英文标题】:Hibernate only error: "Column must appear in the GROUP BY clause or be used in an aggregate function" 【发布时间】:2020-02-02 00:46:40 【问题描述】:

我有这个由 hibernate 生成的查询(打印在控制台上),如果直接执行 throwg pgAdmin4,它可以正常工作:

select
        my_entity0_.status as col_0_0_,
        calc_sub_status(
            my_entity0_.status,
            my_entity0_.sub_status
        ) as col_1_0_,
        count(my_entity0_.id) as col_2_0_ 
    from
        demand my_entity0_
    group by
        my_entity0_.status ,
        calc_sub_status(
            my_entity0_.status,
            my_entity0_.sub_status
        )

但在我的应用程序中(使用 Spring Boot 和 Hibernate)我得到了这个异常:

SQL Error: 0, SQLState: 42803
ERROR: column "my_entity0_.sub_status" must appear in the GROUP BY clause or be used in an aggregate function

如果相同的查询在 pgAdmin 中运行,但不能通过 jdbc 运行,该怎么办?

PS:calc_sub_status是自定义函数,接收2个字符串,返回一个字符串。

PS2:标准代码:

cq.multiselect(status, calcSubStatus, cb.count(root))
                .groupBy(status, calcSubStatus);

【问题讨论】:

这难以置信。您忽略了两个查询之间可能存在一些细微的“拼写”差异。 hibernate 是否不会传递有关查询中发生/检测到错误的位置信息? “位置 81”是唯一的线索 【参考方案1】:

我能够跳过这个仅限休眠的错误,将查询更改为:

select
        my_entity0_.status as col_0_0_,
        calc_sub_status(
            my_entity0_.status,
            my_entity0_.sub_status
        ) as col_1_0_,
        count(my_entity0_.id) as col_2_0_ 
    from
        demand my_entity0_
    group by
        my_entity0_.status ,
        2

不同之处在于 group by 子句,我按结果的位置“2”分组,而不是重复函数调用。

在 pgAdmin 中两种方式都有效,但在 hibernate 中只有这种替代方法有效。

归档这个的标准函数是cb.literal(position)

cq.multiselect(status, calcSubStatus, cb.count(root))
                .groupBy(status, cb.literal(2));

【讨论】:

以上是关于仅休眠错误:“列必须出现在 GROUP BY 子句中或在聚合函数中使用”的主要内容,如果未能解决你的问题,请参考以下文章

GroupingError:错误:列必须出现在 GROUP BY 子句中或在聚合函数中使用

Postgresql“列必须出现在 GROUP BY 子句中或在聚合函数中使用”和唯一字段

Django 与 Postgresql,列必须出现在 GROUP BY 子句中或在聚合函数中使用

休眠查询日期仅比较月份

休眠:是不是可以仅在测试时“保存级联”?

如何仅使用一个连接在休眠中进行嵌套事务?