2013-03-04 3 views
1

У меня есть перечисление со значениями int, присвоенными каждому элементу.JPA: Сравнение (> =) порядкового enum в запросе

public enum RankEnum { 
      NO_RANK(0), 
      FIRST_RANK(1), 
      ..., 
      LAST_RANK(7); 

      private int rank; 

      RankEnum(int rank) { this.rank = rank; } 

      public int getRank() { return this.rank; } 
    } 

intetion целочисленных значений было сделать проще сравнивать различные элементы друг с другом, в отношении их ранга (например e1.rank < e2.rank2). Поэтому я сопоставляюсь их в своей сущности, как это:

@Column(...) 
    @Enumerated(EnumType.ORDINAL) 
    private RankEnum rank; 

К сожалению, когда я пытаюсь создать запрос для поиска, например, все объектов с более высоким рангом, чем другая сущность х результатов не является правильным.

Select entity FROM Entity entity WHERE entity.rank > :rank 

: ранг связан с x.getRank();

Таким образом, вопрос был бы следующим: что такое jpa, фактически сравнивающее в этом случае? Поскольку отображение является порядковым, я думал, что это должно работать, поскольку значения хранятся как целые числа.

Заранее спасибо.

+0

Ну, вы посмотрели, какой SQL генерируется? –

+0

... где entity0_.RANK>? – Alex

+0

Хорошо, а как выглядит RANK в базе данных? Вы говорите, что результат «неправильный» - что происходит, по сравнению с тем, что вы ожидаете? –

ответ

0

Ординал вашего перечисления не имеет ничего общего с рангом, присвоенным каждому экземпляру перечисления. Каждое перечисление имеет порядковый номер. Порядковый начинается с 0 для первого признано одним, а затем 1, затем 2 и т.д.:

public enum Season { 
    WINTER, // ordinal = 0 
    SPRING, // ordinal = 1 
    SUMMER, // ordinal = 2 
    AUTUMN; // ordinal = 3 
} 

И перечисления автоматически сравним по их порядковому. Итак, Season.WINTER.compareTo(Season.SPRING) < 0.

+0

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

+0

Включите ведение журнала SQL и посмотрите, какой SQL-запрос сгенерирован и с какими аргументами. Сообщите нам, что содержит база данных, что делает тест, что вы ожидаете в результате и что получаете вместо этого. Проверьте свой тест: заголовок вашего вопроса говорит '> =', но запрос говорит '>'. –

Смежные вопросы