2014-11-10 2 views
1

Я работаю проект, который использует перечисления в качестве столбцов в базу данныхHibernate рода основан на перечислении

public enum MyEnum{ 
a1(1,"act1"), 
a2(2,"act2"), 
a3(3,"act3"), 
b1(4,"bob1"), 
c1(10,"cake1"), 
c2(11,"cake2"), 
} 

@Entity 
public class MyEntity{ 
.. 

private Integer myEnumIntValue; 

... 

} 

(Примечание: myEnumIntValue не отображается, как перечисление в сущности)

У меня есть спящий режим запрос на запрос MyEntity. Запрос заказывает результат, основанный на Int значения перечисления

createCriteria(MyEntity.class).addOrder("myEnumIntValue"); 

Это было все хорошо, пока перечисление не было изменено на

Public enum MyEnum{ 
a1(1,"act1"), 
a2(2,"act2"), 
a3(3,"act3"), 
a4(7,"act4"), 
b1(4,"bob1"), 
c1(10,"cake1"), 
c2(11,"cake2") 
} 

Теперь становится проблемой, потому что порядок результата я я получаю (a1,a2,a3,**b1,a4**,c1,c2), но сортировка Субъектов должна быть (a1,a2,a3,**a4,b1**,c1,c2)

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

+0

Итак, вам нужен «запрос на спящий режим», который заказывает запрос на основе строкового значения перечисления? – Narmer

+0

enum сохраняется как целое число в базе данных, поэтому запрос упорядочен на основе значения Integer – user3308224

+0

Тогда ваше единственное решение - это то, что я написал, на самом деле вы находитесь в '' не можете манипулировать частью запроса ''. – Narmer

ответ

0

Если вы не хотите/не можете манипулировать запросом для заказа перечислений при извлечении, помните, что все перечисления реализуют Comparable interface.

Вы можете переопределить метод compareTo() и выполнить сортировку с помощью java-кода.

Чтобы получить конкретные:

public enum MyEnum{ 
a1(1,"act1"), 
a2(2,"act2"), 
a3(3,"act3"), 
b1(4,"bob1"), 
c1(10,"cake1"), 
c2(11,"cake2"); 

private number; 
private name; 

public MyEnum(Integer number, String name){ 
    this.number = number; 
    this.name = name; 
} 

//getters and setters 

@Override 
public int compareTo(MyEnum otherEnum){ 
    return this.getName().compareTo(otherEnum.getName()); 
} 

} 

Как только у вас есть List<MyEnum> myList извлекается из БД, вам нужно только позвонить:

Collections.sort(myList); 

получить ваши перечислений отсортированы по name.

+0

Мне нужна сортировка, если возможно, в запросе (например, критерий.addOrder или что-то вроде установки проецирования), потому что критерии передаются объекту «Пейджинг» (т. Е. Запрос должен быть уже отсортирован, когда он передается объекту поискового вызова ") – user3308224

+0

Ну, но если у вас нет ссылки на' name' в вашей БД, просто невозможно заказать по 'name' в запросе. – Narmer

+0

@ user3308224 Кроме того, как вы заполняете поле« имя », имеющее только «номер» из базы данных? – Narmer

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