web-dev-qa-db-ja.com

HQL選択でのCASEステートメントの使用

HQLで以下を実行する方法はありますか?

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

.64.[inline edit]...どこでできるか-句:

「シンプル」なケース、case ... when ... then ... else ... end、「検索された」ケース、case when ... then ... else ... end

10
Henrik Paul

Hibernate-Forumを参照してください: https://forum.hibernate.org/viewtopic.php?t=942197

チームからの回答(Gavin):ケースはwhere句でサポートされていますが、HB3のselect句ではサポートされていません。

そして、状態が「未解決」のJIRAで見られます。

5
Stephan Prantl

どうやらこれを行う能力は .0.4で追加 でしたが、else句で副選択を使用できないという制限があります。

5
Hilton Campbell

以下に、2つのcaseステートメントを使用してブール値を対応するテキスト表現に置き換える、有効なクエリ(postgresqlのhibernate)を示します。

SELECT CASE ps.open WHEN true THEN 'OPEN' else 'CLOSED' END、CASE ps.full WHEN true THEN 'FULL' else 'FREE' END、ps.availableCapacity FROM ParkingState as ps

4
Ruben

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

休止状態の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

しかし、これは実際に私たちが必要とすることを実行するのではなく、クエリの上で正確に実行したいので、HQLのビットがあるcaseステートメントの最後に変数を割り当てることができることがわかります。

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

クエリをケースステートメントに基づいて機能させることができました。かなり長い時間をかけていますが、実際には最初のインスタンスと同じです

0
Vahid