hibernate postgresql criteriaquery

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

发布于 2020-04-11 23:10:14

我有由休眠生成的查询(打印在控制台上),如果直接执行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);

查看更多

提问者
smaudi
被浏览
14
smaudi 2020-02-03 22:13

我能够跳过此仅休眠状态的错误,将查询更改为:

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中,两种方法都有效,但是在休眠状态下,仅此替代方法有效。

归档此文件的条件函数是cb.literal({position})

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