Используя оператор CASE в HQL, выберите - PullRequest
16 голосов
/ 19 января 2009

Есть ли способ сделать следующее в HQL:

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable

Ответы [ 7 ]

10 голосов
/ 19 января 2009

Я полагаю, вы можете ( 3,6 , 4,3 ) [встроенное редактирование] ... для предложений where:

«Простой» случай, case ... when ... then ... else ... end и «искомый» случай, case when ... then ... else ... end

5 голосов
/ 15 января 2010

См. Hibernate-Forum: https://forum.hibernate.org/viewtopic.php?t=942197

Ответ команды (Гэвин): case поддерживается в предложении where, но не в предложении select в HB3.

И замечено в JIRA с состоянием "Неразрешенный".

5 голосов
/ 19 января 2009

Очевидно, что возможность сделать это была добавлена ​​в 3.0.4 , с ограничением, что вы не можете использовать подвыборы в предложении else.

4 голосов
/ 12 февраля 2009

Ниже вы можете найти рабочий запрос (hibernate на postgresql), который использует 2 оператора case для замены логического значения соответствующим текстовым представлением.

ВЫБЕРИТЕ СЛУЧАЙ ps.open КОГДА истина ТОГДА «ОТКРЫТО», еще «ЗАКРЫТО», КОНЕЦ, СЛУЧАЙ ps.full ЕСЛИ правда, ТО «ПОЛНЫЙ» еще 'FREE' END, ps.availableCapacity FROM ParkingState как ps

0 голосов
/ 27 декабря 2018

Я столкнулся с той же проблемой в HQL, затем решил следующий запрос:

select CONCAT(event.address1,', ', CASE WHEN event.address2 IS NULL THEN '' ELSE concat(event.address2,', ') END, event.city from EventDetail event where event.startDate>=:startDate and event.endDate<=:endDate;
0 голосов
/ 06 июля 2018

Мы широко используем HQL-запрос HQL, и я думаю, что, наконец, существует такой хакерский способ:

Предполагая, что у нас изначально был запрос

i2.element.id = :someId

Затем решил расширить это так:

((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))

Но возникла проблема, когда мы хотим, чтобы он осуществлял поиск только на основе classType, поэтому оператор case:

(case when type(i)=Item then 
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
else
i.element.id = :someId
end)

Выше не будет работать, вы можете сделать простую версию выше, выполнив:

(case when type(i)=Item then 
i2.element.id
else
i.element.id
end)=:elementId

Но на самом деле это не делает то, что нам нужно, мы хотим, чтобы он выполнял точно вышеуказанный запрос, поэтому, зная, что вы можете назначить переменную в конце оператора case там, где бит HQL:

(
                            (
                                (case when 
                                    type(r)=Item then 
                                        i.element.id 
                                    else 
                                        i.element.id end) = :elementId 
                                and 
                                (case when 
                                    type(r)=Item then 
                                        i2.element.id 
                                    else 
                                        i.element.id end) = :elementId
                            )
                            or 
                            (case when 
                                    type(r)=Item then 
                                        i2.element.id 
                                    else 
                                        i.element.id end) = :elementId 
                            )

Мне удалось заставить запрос теперь работать на основе оператора case, конечно, он намного длиннее, но фактически делает то же самое, что и первый экземпляр

0 голосов
/ 10 июня 2009

Это пример использования сравнения строк в условии:

SELECT CASE f.type WHEN 'REMOVE'
                   THEN f.previousLocation 
                   ELSE f.currentLocation 
       END 
FROM FileOperation f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...