2011-02-04 22 views
2

私はこのような列挙型を持っている:HQLのenum属性にどのようにアクセスできますか?

TicketPriority { 

LOW(4), 
NORMAL(3), 
HIGH(2), 
IMMEDIATE(1); 

private Integer index; 

TicketPriority (Integer index){ 
    this.index = index; 
} 

public Integer getIndex(){ 
    return this.index; 
} 

public void setIndex(Integer index){ 
    this.index = index; 
} 
} 

...と私は優先順位を持つチケットエンティティを持っています。問題:

select t from Ticket t order by t.priority.index 

私は休止状態からのエラーを得た:私は、私はこれが働くだろうと思ったが、それはなかった優先順位によって私の結果を注文する必要があります。エンティティとしてプライオリティを作成する以外のアイデアですか?

ありがとうございました! :)

+0

あなたのチケットがエンティティであり、優先度が含まれている場合、優先度をエンティティでも最初の場所でHibernateで使用できるエンティティにしないでしょうか? – limc

+0

エラーまたはスタックトレースを投稿できませんか?それは詳細なしで暗闇の中でただのショットです。 – hisdrewness

+0

私は後でエラーを投稿しますが、基本的にhibernateは私のインデックスvarが存在しないことを私に伝えます。 :( – Duprat

答えて

1

このようにすることはできません。

HQLクエリは実行のためにSQLに変換されるため、HQLクエリで参照されるすべてのプロパティをデータベースに格納する必要があります。 indexプロパティはデータベースに格納されていないので、それを使用するHQLクエリはSQLクエリに変換できません。

HQLクエリのORDER BY節で列挙型を使用することは、データベース表現の自然順序(名前または順序番号)のみで並べ替えることができます。

あなたは、いくつかのオプションがあります:

  1. がその宣言の順序は、そのindex ESの所望の順序に一致するように、あなたのenum Sを整理し、序数としてデータベースに格納するために休止状態を設定します。それがすでに設定されます場合は、あなたのケースで目的のクエリは、データベースにindexを格納する代わりにenumのクラス

    select t from Ticket t order by t.priority desc 
    
  2. 使用@Embeddable/<component>だろう。

  3. 列挙型を表すカスタム型をindexと記述します。
+0

ありがとうございました!私は最初のものを試してみることができましたが、これは可能であることはわかりませんでした@ Enumerated(EnumType.ORDINAL)アノテーションを使用する必要があります。 – Duprat

関連する問題