質問
、本当にありがとうしなければならない、HQL:
SELECT
case when flag = true then SUM(col1) else SUM(col2)
FROM
myTable
他のヒント
どうやらこれを行う機能は 3.0.4で追加されました 、else節では副選択を使用できないという制限があります。
Hibernate-Forumをご覧ください: https://forum.hibernate.org/viewtopic.php ?t = 942197
チームからの回答(ギャビン): caseはwhere句でサポートされていますが、HB3のselect句ではサポートされていません。
JIRAで状態<!> quot; Unresolved <!> quot;が表示されます。
以下でワーク(hibernateにpostgresqlを使用する2つの場合には諸表に置き換えるboolean値に対応するテキスト表現。
を選択の場合。る場合にtrueを 'OPEN'else'CLOSED'末端の場合 ps.フルがtrue THEN'FULL'else '無料'末、ps.availableCapacity からParkingStateとしてps
Hibernate 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
)
caseステートメントに基づいてクエリを機能させることができました。これはかなり長くなりますが、実際には最初のインスタンスと同じです
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;
これは、条件で文字列比較を使用した例です。
SELECT CASE f.type WHEN 'REMOVE'
THEN f.previousLocation
ELSE f.currentLocation
END
FROM FileOperation f