Как я могу получить доступ к атрибутам перечисления в HQL? - PullRequest
2 голосов
/ 04 февраля 2011

У меня есть 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;
}
}

... и у меня есть объект Ticket, имеющий приоритет.Проблема: мне нужно упорядочить результаты по приоритету, поэтому я подумал, что это сработает, но это не сработало:

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

Я получил ошибку из Hibernate.Любая идея, кроме создания Приоритета как объекта?

Спасибо за любое предложение!:)

1 Ответ

1 голос
/ 04 февраля 2011

Вы не можете сделать это таким образом.

HQL-запрос преобразуется для выполнения в SQL, поэтому все свойства, на которые ссылается HQL-запрос, должны храниться в базе данных.Поскольку ваше свойство index не хранится в базе данных, HQL-запрос с ним не может быть преобразован в SQL-запрос.

Вы можете использовать перечисления в предложении ORDER BY HQL-запроса только для сортировки по натуральномупорядок их представления в базе данных (то есть имена или порядковые номера).

У вас есть несколько вариантов:

  1. Организуйте свои enum s так, чтобы порядок их объявлений соответствовалжелаемый порядок их index и настроить Hibernate для сохранения их в базе данных в виде порядковых номеров.Если он уже настроен, в вашем случае желаемый запрос будет

    select t from Ticket t order by t.priority desc
    
  2. Использовать класс @Embeddable / <component> вместо enum для хранения index в базе данных.

  3. Напишите пользовательский тип для представления вашего перечисления в виде index.
...