JPQL заказ по Enum - PullRequest
       25

JPQL заказ по Enum

0 голосов
/ 09 февраля 2012

Я бы хотел получить данные из таблицы, упорядоченной по приоритетному столбцу enum.Мы используем javaee 6, GF 3.1.

Наша сущность выглядит следующим образом

@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 Ответ

3 голосов
/ 19 мая 2012

Единственный способ, которым вы можете повлиять на порядок приоритета вне вашего именованного запроса, - это выбрать тип атрибута enum (ORDINAL, STRING).

Даже если переопределение CompareTo будет вслух, это ничего не изменит,потому что он не вызывается при выполнении запроса.Причина этого заключается в том, что JPQL-запрос преобразуется в SQL-запрос, и отсутствует концепция вызова методов Java из SQL-запроса.

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

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

...