【问题标题】:How do I guarantee the order of items in a collection如何保证集合中项目的顺序
【发布时间】:2010-10-23 03:26:14
【问题描述】:

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

我现在有这个

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

如果纯粹使用 JPA 无法做到这一点,我将使用 EclipseLink 作为我的 JPA 提供程序,因此如果没有其他帮助,EclipseLink 特定的注释就可以了。

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

【问题讨论】:

    标签: java jpa eclipselink


    【解决方案1】:

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

    如果您给实体一个自动生成的整数 ID,这可能会起作用,但我不想保证。

    【讨论】:

      【解决方案2】:

      你可以

      1. 在创建前对列表进行排序
      2. 创建后对列表进行排序
      3. 使用对插入执行排序的集合。树图、树集

      【讨论】:

      • 虽然可以选择在查询之后进行排序,但提问者的问题不在于使用的数据结构,而在于 JPA 提供者确定插入列表项的顺序。我没有答案(我正在寻找相同的问题),我可以说这个答案解决了错误的问题。
      【解决方案3】:

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

      TBH 大部分的集合都是有序的,不是吗...

      查看文档,大多数会说是否已订购。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-08-30
            相关资源
            最近更新 更多