Я имею поисковый экран, с помощью JSF, Шва JBoss, и В спящем режиме внизу. Существуют столбцы для A
, B
, и C
, где отношения следующие:
A (1< --; >*) B (1< --; >*) C
Скажем, A
имеет a List< B >
и B
имеет a List< C >
(оба отношения являются one-many).
Упорядочивание поддержек таблицы UI любым столбцом (ASC или DESC), таким образом, я хочу, чтобы результаты запроса были заказаны. Это - причина, я использовал Списки в модели.
Однако я получил исключение, которые В спящем режиме, не может нетерпеливо выбрать несколько сумок (оно полагает, что оба списка сумки). Здесь существует интересное сообщение в блоге, и они определяют следующие решения:
Я изменил Список для Установки, который между прочим более корректен, образцово-мудр.
PersistentSet
возвращенный В спящем режиме, переносит a HashSet
, который не имеет никакого упорядочивания. Так, когда я выполняю итерации по нему в UI, порядок произволен, независимо от того, что, приказывая, чтобы база данных сделала.PersistentSet
переносит a LinkedHashSet
, который имеет упорядочивание и является тем, что я хотел бы. Однако OrderBy
свойство является hardcoded и имеет приоритет по любому упорядочиванию, я установил оба Набора использования (ссылка) или HQL (ссылка). По сути, все другое упорядочивание, которое я запрашиваю через UI, прибывает после него.Я попробовал еще раз с Sets
, и используемый SortedSet
(и его реализация, TreeSet
), но у меня есть некоторые проблемы:
Я хочу заказать для происхождения в DB, и не в оперативной памяти, который является что TreeSet
делает (или через Компаратор, или через интерфейс Comparable элементов).
Я нашел, что существует Быть в спящем режиме аннотация @Sort, который имеет a SortOrder.UNSORTED
и можно также установить Компаратор. Мне все еще не удалось заставить его скомпилировать, но я все еще не убежден, что это - то, в чем я нуждаюсь.
Одно из требований - чтобы сортировка произошла в DB.
Созданный простой проект Знатока и фиксировавший это как проект Google Code. Это - моя персональная детская площадка для проблемы.
Какой смысл упорядочивать в БД, когда один и тот же набор результатов может быть переупорядочен по любому столбцу? Если вам нужно нажимать на БД каждый раз, когда в пользовательском интерфейсе щелкают другой столбец, вы просто создаете проблему с производительностью для себя. Это как раз тот случай, когда есть смысл упорядочить набор в памяти.
Что касается пакетов и списков, вот что говорится в блоке Hibernate:
Пакеты нельзя сортировать (к сожалению, нет ни
TreeBag
), ни списков; порядок элементов списка определяется индексом списка.
Основываясь на том, что сказал Hibernate in Action, и обходном пути, предоставленном в вашем собственном ответе, вы можете сортировать коллекцию во время выполнения, чтобы избежать исключения
@Entity
public class Aa {
private List<Bb> bbList - new ArrayList<Bb>();
@OneToMany
public List<Bb> getBbList() {
return bbList;
}
@Transient
public List<Bb> getBbListSortedBySomeProperty() {
Collections.sort(bbList, new Comparator<Bb>() {
public int compare(Bb o1, Bb o2) {
return o1.getSomeProperty().compareTo(o2.getSomeProperty());
}
});
return bbList;
}
}
Помните, что someProperty должен реализовать Comparable
...
@Entity
public class Bb {
private List<Cc> ccList - new ArrayList<Cc>();
@OneToMany
public List<Cc> getCcList() {
return ccList;
}
}