it-swarm.com.de

Verwenden Sie eine CASE-Anweisung in HQL select

Gibt es eine Möglichkeit, in HQL Folgendes zu tun:

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

Ich denke, Sie können ( 3.6 , 4.3 ) [inline edit] ... für where-Klauseln:

"Einfacher" Fall case ... when ... then ... else ... end und "durchsuchter" Fall case when ... then ... else ... end

9
Henrik Paul

Offensichtlich war die Möglichkeit, dies zu tun, hinzugefügt in 3.0.4 , mit der Einschränkung, dass Sie keine Unterauswahlen in der else-Klausel verwenden können.

5
Hilton Campbell

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

Antwort von Team (Gavin): Fall wird in der where-Klausel unterstützt, nicht aber in der select-Klausel in HB3.

Und in JIRA mit Staat "Ungelöst" gesehen.

4
Stephan Prantl

Im Folgenden finden Sie eine Arbeitsabfrage (Hibernate in postgresql), die 2 case-Anweisungen verwendet, um einen booleschen Wert durch die entsprechende Textdarstellung zu ersetzen. 

SELECT CASE ps.open WENN true DANN 'OPEN' oder 'END GESCHLOSSEN' ENDE, CASE Ps.full WENN true? DANN 'FULL' sonstiges 'FREE' ENDE, ps. availableCapacity FROM ParkingState als ps

4
Ruben

Ich habe das gleiche Problem in HQL, dann löste ich die folgende Abfrage

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

Wir verwenden die HQL-Abfragen in großem Umfang und ich glaube, es gibt endlich eine hackende Art, so etwas zu tun:

Angenommen, wir hatten ursprünglich eine Abfrage von

i2.element.id = :someId

Dann beschlossen wir, dies so auszudehnen:

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

Es gab jedoch ein Problem, bei dem wir nur basierend auf classType suchen sollten, also eine Case-Anweisung:

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

Obiges funktioniert nicht, Sie können eine einfache Version der obigen Arbeit erstellen, indem Sie Folgendes tun:

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

Aber das tut nicht wirklich das, was wir brauchen, wir wollen, dass es genau über der Abfrage abläuft. Wenn Sie wissen, dass Sie am Ende einer case-Anweisung dort eine Variable zuweisen können, wo etwas von 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 
                            )

Ich habe es geschafft, dass die Abfrage jetzt auf der Basis von Fallaussagen funktioniert. Ich bin sicher, dass sie viel langatmiger ist, aber tatsächlich dasselbe wie die erste Instanz

0
Vahid