2012-02-09 126 views
0

我想從按優先級列排序的表中獲取數據,該列是enum。我們使用javaee 6,GF 3.1。JPQL通過枚舉排序

我們的實體看起來像這樣

@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類中是final的。

我能在這種情況下做什麼?如何以好方式完成?

我知道我可以將優先級存儲爲數字等,但是我必須手動將實體同步到Enum,這不是非常好。 也許@PrePersist,@PreUpldate和@PostLoad方法是否可行?那麼jpql查詢怎麼樣?

感謝,

米蘭

回答

1

只有這樣,你可以如何影響優先順序的已命名的查詢選擇枚舉屬性(ORDINAL,STRING)的類型之外。

即使重寫compareTo會大聲,它不會改變一個事物,因爲它不會在執行查詢時被調用。原因是JPQL查詢被轉換爲SQL查詢,並且沒有從SQL查詢中調用Java方法的概念。

此外,指定回調方法並沒有幫助,因爲它們與生成查詢或影響結果列表的順序無關。

你可以做的是有一個後處理方法,它定義你的列表的順序,並在你執行命名查詢的結果後調用它。

+0

感謝您的回答,以及您說的基本上是重新排序返回的結果,我是對嗎? – udik 2012-08-08 15:24:41

+0

的確,你是對的。 – 2012-08-29 04:48:14