2012-02-09 15 views
0

私は、列挙型の優先順位の列で並べ替えられたテーブルからデータをフェッチしたいと思います。我々は、javaee 6、GF 3.1を使用します。このJPQL Enumで注文

@Entity 
@Table(name="ITEMS") 
@NamedQueries({ 
    @NamedQuery(
     name = "Item.findbyPriority", 
     query = "select i from Item i where ORDER BY i.priority DESC") 
}) 
public class Item implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    Integer id; 



    String data inputFile; 


    @Enumerated(EnumType.ORDINAL) 
    Priority priority; 


... 
} 

優先順位は序、およびリターンで

public enum Priority { 

    HIGH, 
    NORMAL; 
} 

しかしItem.findbyPriorityクエリの種類を定義しているように私たちの実体が見え

が誤った順序になります。私が優先クラスを変更した場合

public enum Priority { 

     NORMAL, 
     HIGH; 
    } 

正常に動作します。しかし、それは本当に堅牢ではありません。新しい優先度を追加したり、並べ替えるとどうなりますか?

compareToメソッドをオーバーライドしようとしましたが、最後はEnumクラスです。

この場合、私は何ができますか?どのようにしてうまくいくのですか?

私は数字などとして優先順位を格納することができると知っていますが、Enumにエンティティを同期する必要があります。 @PrePersist、@PreUpldate、および@PostLoadメソッドはどうなるのでしょうか?どのようにしてjpqlクエリのようになりますか?

おかげで、

ミラノ

答えて

1

唯一の方法あなたがあなたの名前のクエリが列挙属性(ORDINAL、STRING)の種類を選んでいるの外に優先順位をどのように影響しますか。

compareToをオーバーライドしても、クエリを実行しても呼び出されないため、何も変更されません。その理由は、JPQLクエリがSQLクエリに変換され、SQLクエリからJavaメソッドを呼び出すという概念がないからです。

また、コールバックメソッドを指定しても、クエリの生成や結果リストの順序に影響しないため、コールバックメソッドを指定することは役に立ちません。

あなたができることは、あなたのリストの順序を定義し、名前付きクエリの実行結果が得られた後にそれを呼び出す後処理メソッドを持つことです。

+0

あなたの答えはありがとう、あなたの言うことは基本的に返された結果を並べ替えることです、そうですか? – udik

+0

まさに、あなたは正しいです。 –