【问题标题】:Hibernate does not keep DB order in the LinkedHashSet collectionHibernate 不会在 LinkedHashSet 集合中保持数据库顺序
【发布时间】:2023-03-15 10:11:02
【问题描述】:

当从 DB 中检索值时,hibernate 不会在 Set 类型的集合中保留插入顺序,而是将其保留在 List 集合中。我尝试手动指定LinkedHashSet,但没有帮助。

我有以下父实体

@Entity
@Table(name = "radio")
@PrimaryKeyJoinColumn(name = "id", referencedColumnName = "id")
public class Radio extends AbstractField {

   @OneToMany(cascade = CascadeType.ALL)
   @JoinColumn(name = "radio_id")
   private Set<Choice> choices = new LinkedHashSet<>();
}

和子实体:

@Entity
@Table(name = "choice")
public class ChoiceEntity  {

   @Id
   @GeneratedValue
   @Column(name = "id", nullable = false)
   private UUID id;

   @Column(name = "value")
   private String value;
}

当我从数据库中检索值时,休眠将它们以随机顺序存储在choices 集合中。当我将集合类型更改为使用 List 时,一切正常。

是否可以将休眠配置为在 Set 类型的集合中保持 DB 顺序而不使用任何添加 order_row

【问题讨论】:

  • 这是集合的定义 - 它是无序的 :) stackoverflow.com/questions/1035008/…
  • 但是 LinkedHashSet 保持插入顺序,并且对 LinkedHashSet 的迭代实际上提供了正确的顺序。我想知道是否可以配置休眠来使用它。
  • imo 如果你需要一个订单,那么你应该确保在你的数据库端正确排序,通过使用 ID、日期或其他字段并在查询中输入 ORDER BY
  • 这是数据库的本质,通常也是数学中的集合论。集合是具有相似属性的数据的集合,顺序无关紧要。检查这个问题dba.stackexchange.com/questions/6051/…
  • 还有一个关于您的数据库如何将信息保存在磁盘上的抽象。数据库引擎做了很多优化,比如缓存索引等等,没有什么能保证你的记录以相同的顺序保存。事实上,如果你有一个分布式数据库集群,它们甚至可能不在同一台服务器上

标签: java hibernate jpa collections


【解决方案1】:

使用@javax.persistence.OrderBy@org.hibernate.annotations.OrderBy。前者需要一个在 HQL/JPQL 中定义的片段,而后者需要一个 SQL 片段

【讨论】:

    猜你喜欢
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多