如何保证集合中项目的顺序

时间:2009-05-01 14:58:52

标签: java jpa eclipselink

我有一个对象列表,列表中的每个对象都有一个位置,除非明确更改,否则可能不会改变,换句话说,对象在队列中。我应该在我的实体类中使用什么集合来存储这些对象以及如何对该集合进行注释?

我目前有这个

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

如果纯粹使用JPA这是不可能的,我使用EclipseLink作为我的JPA提供程序,因此如果没有别的帮助,EclipseLink特定的注释就可以了。

编辑:注意人,问题不在于Java不会保存命令,我知道大多数集合都有,问题是我不知道JPA保存命令的聪明方法。拥有订单ID并通过它创建查询顺序是可能的,但在我的情况下维护订单ID是费力的(因为用户界面允许重新排序项目),我正在寻找一种更聪明的方法来做到这一点。

5 个答案:

答案 0 :(得分:4)

如果要在往返SQL之后对其进行排序,则应在实体本身中提供某种排序ID - SQL自然是面向集合而不是面向列表。然后,您可以在获取它们之后进行排序,或者确保您的查询也指定了顺序。

如果你给实体一个自动生成的整数ID,这个可能有效,但我不想保证。

答案 1 :(得分:4)

使用排序顺序ID,如Jon建议的那样,然后在@OneToMany下面添加@OrderBy注释。这将按指定字段对任何查询进行排序。

例如,如果向Bar添加名为“sortId”的新字段,Foo将如下所示:

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

答案 2 :(得分:0)

你可以

  1. 创建前对列表进行排序
  2. 创建后对列表进行排序
  3. 使用对插入执行排序的集合。 TreeMap,TreeSet

答案 3 :(得分:0)

链表实现了java中的Queue接口,允许你在中间添加东西......

TBH大部分收集的订单都不是......

检查文档,大多说是否订购。

答案 4 :(得分:0)

值得尝试LinkedList而不是ArrayList,但是,正如Jon所说,你需要找到一种方法来保存订单信息。

解决方案可能涉及向每个条目发出一个订单号,并将其存储为SortedMap,转换为List时,如果List是您需要的。

但是,如果您将集合存储为LinkedList,ORM可能会足够聪明地为您完成所有转换。