3

CASE WHEN ... ENDHibernate @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;
4

2 に答える 2

5

@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ビューに基づいているため、エンティティを挿入または更新できないことに注意してください。

于 2013-10-10T16:12:50.367 に答える
2

org.hibernate.annotations.OrderByjavax.persistence.OrderByhibernate docs で述べられているように、JPQL を使用するのとは異なり、ネイティブ SQLを使用します。

(HQL 順序ではなく) SQL 順序を使用してコレクションを順序付けます。{@link javax.persistence.OrderBy} とは異なり、これは SQL フラグメントを期待するという点で、JPA OrderBy は有効な JPQL オーダーバイ フラグメントを期待します。

于 2020-08-30T12:07:20.320 に答える