Как я могу гарантировать заказ предметов в коллекции - PullRequest
1 голос
/ 01 мая 2009

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

У меня сейчас есть

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  List<Bar> bars = new ArrayList<Bar>();
  ...
}

Если это невозможно только в JPA, я использую EclipseLink в качестве поставщика JPA, поэтому специальные аннотации EclipseLink будут в порядке, если больше ничего не поможет.

РЕДАКТИРОВАТЬ: обратите внимание, проблема не в том, что Java не будет сохранять порядок, я знаю, что большинство коллекций это делают, проблема в том, что я не знаю умного способа для JPA сохранить порядок. Наличие идентификатора заказа и создание порядка запроса возможно, но в моем случае поддержание идентификатора заказа является трудоемким (поскольку пользовательский интерфейс позволяет изменять порядок элементов), и я ищу более разумный способ сделать это.

Ответы [ 5 ]

4 голосов
/ 01 мая 2009

Используйте идентификатор порядка сортировки, как предложил Джон, затем добавьте аннотацию @OrderBy под @OneToMany. Это упорядочит любой запрос по указанному полю.

Например, если вы добавите новое поле с именем sortId в Bar, Foo будет выглядеть так:

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  @OrderBy("sortId ASC")
  List bars = new ArrayList();
  ...
}
4 голосов
/ 01 мая 2009

Если вы хотите, чтобы это упорядочивалось после циклического перехода к SQL, вы должны предоставить некоторый вид идентификатора упорядочения внутри самой сущности - SQL, естественно, ориентирован на множество, а не на список. После этого вы можете либо отсортировать их, либо убедиться, что в вашем запросе также указан порядок.

Если вы дадите сущности автоматически сгенерированный целочисленный идентификатор, это может работать, но я не хотел бы гарантировать это.

0 голосов
/ 01 мая 2009

Стоит попробовать LinkedList вместо ArrayList, однако, как сказал Джон, вам нужно найти способ сохранения информации о заказе.

Решение, вероятно, будет заключаться в выдаче номера заказа для каждой записи и сохранении его в виде SortedMap при преобразовании в список, если список необходим вам.

Однако ORM потенциально может быть достаточно умным, чтобы выполнить все преобразования за вас, если вы сохранили коллекцию как LinkedList.

0 голосов
/ 01 мая 2009

Связанный список реализует интерфейс Queue в java и позволяет добавлять вещи в середине ...

ТБХ, большинство коллекций заказаны, не так ли ...

Проверьте документы, большинство говорят, заказаны они или нет.

0 голосов
/ 01 мая 2009

Вы можете

  1. Сортировка списка перед созданием
  2. Сортировка списка после создания
  3. Использовать коллекцию, которая выполняет сортировку при вставке. TreeMap, TreeSet
...