Как я могу гарантировать заказ предметов в коллекции

StackOverflow https://stackoverflow.com/questions/811758

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

@Entity
class Foo {
  ...
  @OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
  @OrderBy("sortId ASC")
  List bars = new ArrayList();
  ...
}

Вы можете

<Ол>
  • Сортировка списка перед созданием
  • Сортировка списка после создания
  • Используйте коллекцию, которая выполняет сортировку при вставке. TreeMap, TreeSet
  • Связанный список реализует интерфейс Queue в Java и позволяет добавлять вещи в середине ...

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

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

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

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top