Usando uma instrução CASE no HQL selecione
-
19-08-2019 - |
Pergunta
Existe alguma maneira de fazer o seguinte no HQL:
SELECT
case when flag = true then SUM(col1) else SUM(col2)
FROM
myTable
Outras dicas
Aparentemente, a capacidade de fazer isso foi adicionado na versão 3.0.4 , com a limitação que você não pode usar subseleções na cláusula else.
Veja Hibernate-Forum: https://forum.hibernate.org/viewtopic.php ? t = 942197
Resposta do Team (Gavin): caso é suportado na cláusula onde, mas não na cláusula select em HB3.
E visto no JIRA com Estado "não resolvido".
Abaixo, você pode encontrar uma consulta de trabalho (hibernar no PostgreSQL) que as declarações de caso usos 2 para substituir um valor booleano com a representação textual correspondente.
Select Case ps.open QUANDO verdade, então 'ABERTO' else END 'fechado', CASE ps.full QUANDO verdadeiro THEN 'Full' else 'FREE' END, ps.availableCapacity DE ParkingState como ps
Nós usamos o Hibernate HQL query extensivamente e eu acho que finalmente há uma maneira hackish de fazer tal coisa:
Assumindo que originalmente tinha uma consulta de
i2.element.id = :someId
Em seguida, decidiu expandir isso seja algo como isto:
((i.element.id = :someId and i2.element.id=:someId) or (i2.element.id = :someId))
Mas havia um problema onde queremos que ele apenas procura para este baseado em ClassType assim uma instrução 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)
acima não irá funcionar, você poderia fazer uma versão fácil de trabalho acima fazendo:
(case when type(i)=Item then
i2.element.id
else
i.element.id
end)=:elementId
Mas isso não realmente fazer o que precisamos fazer, nós queremos que ele faça exatamente acima consulta, para saber que você pode atribuir uma variável no final de uma instrução case lá onde pouco de 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
)
Eu consegui fazer a consulta agora trabalhar com base na declaração caso, se ele está muito mais prolixo, mas na verdade faz o mesmo que a primeira instância
Eu enfrentando o mesmo problema em HQL então eu resolvido a seguinte consulta é
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;
Este é um exemplo usando uma comparação de string na condição:
SELECT CASE f.type WHEN 'REMOVE'
THEN f.previousLocation
ELSE f.currentLocation
END
FROM FileOperation f