首页 > 解决方案 > 选择 H2 数据库要求按列分组的案例

问题描述

当我使用 HQL 查询我的数据库时,此请求工作正常并返回良好的数据:

    select
    case 
        when activityjp0_.status<>'CLOSED' 
        and (activityjp0_.user_id is null) then 'UNASSIGNED' 
        else case 
            when activityjp0_.status<>'CLOSED' 
            and activityjp0_.deadline<CURRENT_DATE then 'OVERDUE' 
            else case 
                when activityjp0_.status='PENDING' then 'IN_PROGRESS' 
                else activityjp0_.status 
            end 
        end 
    end as col_0_0_,
    count(distinct activityjp0_.id) as col_1_0_ 
from
    activities activityjp0_ 
group by
    case 
        when activityjp0_.status<>'CLOSED' 
        and (activityjp0_.user_id is null) then 'UNASSIGNED' 
        else case 
            when activityjp0_.status<>'CLOSED' 
            and activityjp0_.deadline<CURRENT_DATE then 'OVERDUE' 
            else case 
                when activityjp0_.status='PENDING' then 'IN_PROGRESS' 
                else activityjp0_.status 
            end 
        end 
    end

当我使用 Criteria API 生成 SAME 请求时,它给出:

    select
    case 
        when activityjp0_.status<>? 
        and (activityjp0_.user_id is null) then 'UNASSIGNED' 
        else case 
            when activityjp0_.status<>? 
            and activityjp0_.deadline<? then 'OVERDUE' 
            else case 
                when activityjp0_.status=? then 'IN_PROGRESS' 
                else activityjp0_.status 
            end 
        end 
    end as col_0_0_,
    count(distinct activityjp0_.id) as col_1_0_ 
from
    activities activityjp0_ 
group by
    case 
        when activityjp0_.status<>? 
        and (activityjp0_.user_id is null) then 'UNASSIGNED' 
        else case 
            when activityjp0_.status<>? 
            and activityjp0_.deadline<? then 'OVERDUE' 
            else case 
                when activityjp0_.status=? then 'IN_PROGRESS' 
                else activityjp0_.status 
            end 
        end 
    end

但是这会导致 JDBC 错误声明:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "ACTIVITYJP0_.USER_ID" must be in the GROUP BY list; SQL statement:

选择activityjp0_.status<>时的情况?和 (activityjp0_.user_id 为空) 然后是 'UNASSIGNED' 否则当 activityjp0_.status<>? 和activityjp0_.deadline?和 (activityjp0_.user_id 为空) 然后是 'UNASSIGNED' 否则当 activityjp0_.status<>? 和活动jp0_.deadline

如果我在同一个生成的查询中替换变量,并针对我的数据库(在 h2 控制台中)运行它,它运行时没有错误

这怎么可能 ?

标签: sqljdbch2select-case

解决方案


你有两个非常相似的表达式:

    case 
        when activityjp0_.status<>? 
        and (activityjp0_.user_id is null) then 'UNASSIGNED' 
        else case 
            when activityjp0_.status<>? 
            and activityjp0_.deadline<? then 'OVERDUE' 
            else case 
                when activityjp0_.status=? then 'IN_PROGRESS' 
                else activityjp0_.status 
            end 
        end 
    end

但实际上它们并不相同,因为参数 ( ?) 都是不同的;第一个表达式中有 4 个参数,第二个表达式中有 4 个附加参数。您应该使用group by col_0_0_代替,group by case … end或者您可以在两个表达式中使用相同的索引 ( ?1, ?2, ...) 参数。


推荐阅读