выберите случай с базой данных H2 с просьбой сгруппировать по столбцам - PullRequest
0 голосов
/ 21 апреля 2020

Когда я использую 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 для генерации того же запроса, он дает:

    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

НО это приводит к ошибке JDB C, утверждающей:

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

выберите случай, когда activityjp0_.status <>? и (activityjp0_.user_id имеет значение null), а затем «UNASSIGNED», в противном случае Activityjp0_.status <>? и активность jp0_.deadline? и (activityjp0_.user_id имеет значение null), а затем «UNASSIGNED», в противном случае Activityjp0_.status <>? и activityjp0_.deadline

Если я заменяю переменные в том же сгенерированном запросе и запускаю его для своей базы данных (в консоли h2), он запускается без ошибок

Как это возможно?

1 Ответ

0 голосов
/ 21 апреля 2020

У вас есть два очень похожих выражения:

    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,…) параметры в обоих выражениях.

...