Закажите несколько one-many отношений

Я имею поисковый экран, с помощью JSF, Шва JBoss, и В спящем режиме внизу. Существуют столбцы для A, B, и C, где отношения следующие:

A (1< --; >*) B (1< --; >*) C

Скажем, A имеет a List< B > и B имеет a List< C > (оба отношения являются one-many).

Упорядочивание поддержек таблицы UI любым столбцом (ASC или DESC), таким образом, я хочу, чтобы результаты запроса были заказаны. Это - причина, я использовал Списки в модели.

Однако я получил исключение, которые В спящем режиме, не может нетерпеливо выбрать несколько сумок (оно полагает, что оба списка сумки). Здесь существует интересное сообщение в блоге, и они определяют следующие решения:

  1. Используйте @IndexColumn' аннотация (нет ни одного в моем DB, и кроме того, я хочу, чтобы положение результатов было определено упорядочиванием, не столбцом индекса),
  2. Выберите лениво (по причинам производительности, мне нужна нетерпеливая выборка),
  3. Список изменения для установки

Я изменил Список для Установки, который между прочим более корректен, образцово-мудр.

  • Во-первых, если не используют @OrderBy, PersistentSet возвращенный В спящем режиме, переносит a HashSet, который не имеет никакого упорядочивания. Так, когда я выполняю итерации по нему в UI, порядок произволен, независимо от того, что, приказывая, чтобы база данных сделала.
  • Во-вторых, Если я действительно использую @OrderBy, PersistentSet переносит a LinkedHashSet, который имеет упорядочивание и является тем, что я хотел бы. Однако OrderBy свойство является hardcoded и имеет приоритет по любому упорядочиванию, я установил оба Набора использования (ссылка) или HQL (ссылка). По сути, все другое упорядочивание, которое я запрашиваю через UI, прибывает после него.

Я попробовал еще раз с Sets, и используемый SortedSet (и его реализация, TreeSet), но у меня есть некоторые проблемы:

  1. Я хочу заказать для происхождения в DB, и не в оперативной памяти, который является что TreeSet делает (или через Компаратор, или через интерфейс Comparable элементов).

  2. Я нашел, что существует Быть в спящем режиме аннотация @Sort, который имеет a SortOrder.UNSORTED и можно также установить Компаратор. Мне все еще не удалось заставить его скомпилировать, но я все еще не убежден, что это - то, в чем я нуждаюсь.

Одно из требований - чтобы сортировка произошла в DB.

Созданный простой проект Знатока и фиксировавший это как проект Google Code. Это - моя персональная детская площадка для проблемы.

5
задан double-beep 2 February 2019 в 13:33
поделиться

2 ответа

Какой смысл упорядочивать в БД, когда один и тот же набор результатов может быть переупорядочен по любому столбцу? Если вам нужно нажимать на БД каждый раз, когда в пользовательском интерфейсе щелкают другой столбец, вы просто создаете проблему с производительностью для себя. Это как раз тот случай, когда есть смысл упорядочить набор в памяти.

Что касается пакетов и списков, вот что говорится в блоке Hibernate:

Пакеты нельзя сортировать (к сожалению, нет ни TreeBag ), ни списков; порядок элементов списка определяется индексом списка.

3
ответ дан 15 December 2019 в 06:21
поделиться

Основываясь на том, что сказал 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;
     }

}
0
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: