HQLで以下を実行する方法はありますか?
SELECT
case when flag = true then SUM(col1) else SUM(col2)
FROM
myTable
Hibernate-Forumを参照してください: https://forum.hibernate.org/viewtopic.php?t=942197
チームからの回答(Gavin):ケースはwhere句でサポートされていますが、HB3のselect句ではサポートされていません。
そして、状態が「未解決」のJIRAで見られます。
どうやらこれを行う能力は .0.4で追加 でしたが、else句で副選択を使用できないという制限があります。
以下に、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
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;
休止状態の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
)
クエリをケースステートメントに基づいて機能させることができました。かなり長い時間をかけていますが、実際には最初のインスタンスと同じです