質問

、本当にありがとうしなければならない、HQL:

SELECT 
    case when flag = true then SUM(col1) else SUM(col2)
FROM 
    myTable
役に立ちましたか?

解決

できると思います( 3.6 4.3 [インライン編集] ... where-clausesの場合:

  

<!> quot; Simple <!> quot; case、case ... when ... then ... else ... end、および<!> quot; searched <!> quot;ケース、case when ... then ... else ... end

他のヒント

どうやらこれを行う機能は 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top