Como faço para garantir a ordem dos itens de uma coleção
-
03-07-2019 - |
Pergunta
Eu tenho uma lista de objetos e cada objeto na lista de ocupar uma posição que não pode mudar a menos que mudou de forma explícita, em outras palavras, os objetos estão em uma fila. Que coleção devo usar na minha classe de entidade para armazenar esses objetos e como deve essa coleção ser anotada?
Actualmente tenho esta ??p>
@Entity
class Foo {
...
@OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
List<Bar> bars = new ArrayList<Bar>();
...
}
Se isto não é possível com JPA puramente, estou usando EclipseLink como meu provedor de JPA, de modo anotações específicas EclipseLink será ok se nada mais ajuda.
EDIT: Nota pessoas, o problema não é que Java não Preserv a ordem, eu sei que a maioria das coleções fazer, o problema é que eu não sei uma maneira inteligente para JPA para Preserv a ordem. Ter um ID de ordem e fazer o pedido de consulta por ela é possível, mas no meu caso mantendo a ID do pedido é trabalhoso (porque a interface do usuário permite a reordenação de itens) e eu estou procurando uma maneira mais inteligente de fazê-lo.
Solução
Se você quer este ser encomendado após round-trip to SQL, você deve fornecer algum tipo de ID ordenação dentro da própria entidade - SQL é naturalmente set-orientado, em vez de orientada a lista. Você pode então classificar depois que você pegá-los de volta, ou certificar-se de seus especifica consulta a ordenação também.
Se você dá à entidade uma auto-gerado inteiro ID esta pode trabalho, mas eu não gostaria de garanti-lo.
Outras dicas
Use um ID de ordem de classificação, como Jon sugeriu, em seguida, adicione uma anotação @OrderBy abaixo do @OneToMany. Isto irá pedir qualquer consulta pelo campo especificado.
Por exemplo, se você adicionar um novo campo chamado "SortID" para Bar, Foo ficaria assim:
@Entity
class Foo {
...
@OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
@OrderBy("sortId ASC")
List bars = new ArrayList();
...
}
Você pode
- Classificar uma lista antes da criação
- ordenar uma lista após a criação
- Use uma coleção que executa uma espécie de inserção. TreeMap, TreeSet
A vinculado lista implementa o Inteface fila em Java e permite que você adicione coisas no meio ...
TBH a maioria das coleções são ordenados não são ...
Verifique os docs, a maioria dizer se é ou não eles são ordenados.
Vale a pena tentar LinkedList em vez de ArrayList, no entanto, como disse Jon, você precisa encontrar uma maneira de persistir as informações do pedido.
A solução irá provavelmente envolver a emissão de um número de ordem a cada entrada de armazená-lo como um SortedMap, ao converter para a lista, se a lista é que você precisa.
No entanto, ORM poderia ser suficiente inteligente para fazer todas as conversões para você, se você armazenou a coleção como LinkedList.