2012-02-09 4 views
0

Я бы хотел получить данные из таблицы, упорядоченной по столбцу приоритета, который является перечислением. Мы используем javaee 6, GF 3.1.JPQL Order by 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-запрос, и нет концепции вызова методов Java из SQL-запроса.

Также не следует указывать методы обратного вызова, поскольку они не должны иметь ничего общего с генерацией запроса или воздействием порядка списка результатов.

Что вы можете сделать, так это иметь метод почтовой обработки, который определяет порядок для вашего списка и просто вызывает это после того, как у вас есть результаты выполнения именованного запроса.

+0

спасибо за ваш ответ, ну, что вы говорите, в основном переупорядочивание возвратило результаты, я прав? – udik

+0

Точно, вы правы. –