Ошибка только в спящем режиме: «Столбец должен появляться в предложении GROUP BY или использоваться в статистической функции» - PullRequest
1 голос
/ 02 февраля 2020

У меня есть этот запрос, сгенерированный 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, но не через jdb c?

PS: calc_sub_status - это пользовательская функция, получает 2 строки и возвращает строку.

PS2: код критерия:

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

1 Ответ

0 голосов
/ 03 февраля 2020

Мне удалось пропустить эту ошибку только в режиме гибернации, изменив запрос на:

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));
...