Pergunta

Existe alguma maneira de fazer o seguinte no HQL:

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable
Foi útil?

Solução

Eu acho que você pode ( 3.6 , 4.3 ) [em linha editar] ... para Where-cláusulas:

caso "Simples", case ... when ... then ... else ... end, e "procurado" caso, case when ... then ... else ... end

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top