CASE WHEN ... END
Hibernate @OrderBy アノテーションでネイティブ SQLを使用することは可能ですか? どのように?
例 (Child
オブジェクトにはtype
プロパティがあります):
@OneToMany
@OrderBy("CASE WHEN type='GIRL' THEN 1 WHEN type='BOY' THEN 2 ELSE 3 END ASC")
private List<Child> children;
@OrderBy
注釈は実際には JPA 注釈であり、エンティティのフィールド名のカンマ区切りリストを受け入れて並べ替えます。順序はデータベースへの最初のクエリ時にのみ実行され、リストが変更された場合は維持されません。つまり、@OrderBy
注釈に純粋な SQL を提供することはできません。
回避策の 1 つは、case ステートメントの結果を含む列を追加してビューを作成することです。例えば:
create or replace view V_CHILD as
select
NAME VARCHAR2,
TYPE VARCHAR2,
CASE WHEN type='GIRL' THEN 1 WHEN type='BOY' THEN 2 ELSE 3 END as TYPE_ORDER
from CHILD;
次に、テーブルの場合とまったく同じように、エンティティをビューにマップします。エンティティには、注釈typeOrder
で指定できるフィールドが含まれます。@OrderBy
ビューに基づいているため、エンティティを挿入または更新できないことに注意してください。
org.hibernate.annotations.OrderBy
javax.persistence.OrderBy
hibernate docs で述べられているように、JPQL を使用するのとは異なり、ネイティブ SQLを使用します。
(HQL 順序ではなく) SQL 順序を使用してコレクションを順序付けます。{@link javax.persistence.OrderBy} とは異なり、これは SQL フラグメントを期待するという点で、JPA OrderBy は有効な JPQL オーダーバイ フラグメントを期待します。