web-dev-qa-db-fra.com

En utilisant une instruction CASE dans HQL, sélectionnez

Est-il possible d'effectuer les opérations suivantes dans HQL:

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

Je suppose que vous pouvez ( 3.6 , 4.3 ) [modification en ligne] ... pour les clauses where:

Cas "simple", case ... when ... then ... else ... end, et cas "recherché", case when ... then ... else ... end

9
Henrik Paul

Apparemment, la possibilité de faire cela était ajoutée dans 3.0.4 , avec la limitation que vous ne pouvez pas utiliser de sous-sélection dans la clause else.

5
Hilton Campbell

Voir le forum Hibernate: https://forum.hibernate.org/viewtopic.php?t=942197

Réponse de l'équipe (Gavin): Le cas Est pris en charge dans la clause where, mais pas dans la clause select de HB3.

Et vu dans JIRA avec l'état "Non résolu".

4
Stephan Prantl

Vous trouverez ci-dessous une requête opérationnelle (hibernate sur postgresql) qui utilise 2 instructions case pour remplacer une valeur booléenne par la représentation textuelle correspondante. 

CHOISIR LE CAS ps.open QUAND true THEN 'OUVERT' sinon FIN «FERMÉ», CAS Ps.full QUAND true THEN 'FULL' sinon FIN 'FREE', ps. availableCapacity DE ParkingState en tant que ps

4
Ruben

Je suis confronté au même problème dans HQL alors j'ai résolu la requête suivante est

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
Faiz Akram

Nous utilisons beaucoup la requête Hibernate HQL et je pense qu’il existe une méthode fictive:

En supposant que nous avions à l'origine une question de

i2.element.id = :someId

Puis décidé d'élargir cela pour qu'il ressemble à ceci:

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

Mais il y avait un problème où nous voulions qu'il ne recherche que cette instruction basée sur classType, donc:

(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)

Ci-dessus ne fonctionnera pas, vous pourriez en faire une version facile en faisant:

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

Mais cela ne fait pas réellement ce que nous avons besoin de faire, nous voulons qu'il fasse exactement la requête ci-dessus, donc sachant que vous pouvez assigner une variable à la fin d'une instruction case là où bit 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 
                            )

J'ai réussi à faire en sorte que la requête fonctionne maintenant à partir d'une déclaration de cas. Elle est certes beaucoup plus longue mais fait la même chose que la première instance.

0
Vahid