У меня есть экран поиска, использующий JSF, JBoss Seam и Hibernate внизу. Есть столбцы для A
, B
и C
, где отношения следующие:
A (1< --; >*) B (1< --; >*) C
Скажем, A
имеет List< B >
, а B
имеет List< C >
(оба отношения одно-ко-многим).
Таблица пользовательского интерфейса поддерживает упорядочение по любому столбцу (ASC или DESC), поэтому я хочу упорядочить результаты запроса. По этой причине я использовал списки в модели.
Однако я получил исключение, что Hibernate не может охотно получать несколько пакетов (он считает, что оба списка являются пакетами). Здесь есть интересная запись в блоге здесь , в которой указаны следующие решения:
- Использовать аннотацию @ IndexColumn` (в моей БД ее нет, и более того, я хочу, чтобы положение результатов определялось по порядку, а не по столбцу индекса)
- Получить лениво (по соображениям производительности, мне нужно с нетерпением получить)
- Изменить список для установки
Я изменил список на Set, что, кстати, более корректно, в зависимости от модели.
- Во-первых, если не использовать @OrderBy,
PersistentSet
, возвращаемое Hibernate, оборачивает HashSet
, который не имеет порядка. Поэтому, когда я перебираю его в пользовательском интерфейсе, порядок выбирается случайным образом, независимо от порядка, в котором выполнялась база данных.
- Во-вторых, если я делаю , использую @OrderBy,
PersistentSet
оборачивает LinkedHashSet
, который имеет порядок, и это то, что я хотел бы. Однако , свойство OrderBy
жестко закодировано и имеет приоритет над любым порядком, который я устанавливаю, используя Коллекции ( ссылка ) или HQL ( ссылка ). Таким образом, все остальные заказы, которые я запрашиваю через пользовательский интерфейс, идут после него.
Я попытался снова с Sets
и использовал SortedSet
(и его реализацию, TreeSet
), но у меня есть некоторые проблемы:
Я хочу, чтобы заказ осуществлялся в БД, а не в памяти, что и делает TreeSet
(либо через Comparator, либо через интерфейс Comparable элементов).
Я обнаружил, что есть аннотация Hibernate @Sort, которая имеет SortOrder.UNSORTED
, и вы также можете установить Comparator. Мне все еще не удалось его скомпилировать, но я все еще не уверен, что это то, что мне нужно.
Одним из требований является сортировка в БД.
Создал простой проект Maven и зафиксировал его как Google Code проект. Это моя личная площадка для решения проблемы.