gpt4 book ai didi

Hibernate:@OrderBy vs @OrderColumn 维护集合的顺序

转载 作者:行者123 更新时间:2023-12-03 21:22:53 30 4
gpt4 key购买 nike

在持久化和从数据库中检索时维护集合顺序的首选方法是什么?

我知道 @OrderBy 更像是一种内存中排序,只有当您按照您选择的列的顺序保留行时,它才可能用于检索。

假设我选择使用由数据库序列支持的列, hibernate 将确保集合中的元素以与集合中相同的顺序持久化(比如列表)。

任何想法?

更多细节:

假设我有一个类 A,它与类 B 有一对多的关系。 B 有一个主键字段“Id”,它由 DB 中的序列支持。

Class A {
List<B> bList;
}

我一直想保留 A 中元素 B 的顺序,如下所示:
bList = { b1, b2, b3 }

实现的一种方法是使用@OrderBy(“Id ASC”)。这仅在列表 B 以如下顺序持久化时才有效:
----------------
Id ----bValue
----------------

1------ b1
2------ b2
3-------b3
------------------

当我们检索时,因为它是按 Id 排序的,所以该顺序被维护。

假设集合 B 以下列方式持久化:
----------------
Id ----bValue
----------------
1------ b2
2------ b1
3-------b3
------------------

当我们检索时,列表 B 的顺序会被折腾(因为它是按 Id 列排序)。所以我的问题是,集合 B 是否始终以其出现在列表中的顺序持续存在。

最佳答案

OrderBy 在生成的 SQL 中添加 order by 子句,将检索到的集合的成员按目标实体的表的列进行排序:

@OrderBy("lastname ASC")
public List<Student> students;

将生成一个 SQL 查询,如
select ... order by student.lastname ASC

OrderColumn 定义表中附加列的名称,包含列表中实体的索引。如果更改列表中元素的顺序,Hibernate 将更改此列的值。如果您的学生在此列中有 0、3 和 5 作为值,则列表将为
[student0, null, null, student3, null, student5]

这在 the javadoc 中有很好的描述这2个注释中。

编辑:

B 标识符的分配顺序取决于您如何持久化这些 B 实例:
  • 如果您明确调用 session.save() , 的 session.saveOrUpdate() ,这会为实体分配一个 ID,因此为 b1、b2 和 b3 调用它将遵守顺序
  • AFAIK,所有其他方法(级联、merge()、persist())不保证任何顺序(除非您合并或持久化,然后 flush() )

  • 因此,如果您希望列表按此顺序包含 b1、b2 和 b3,无论它们的持久化方式如何,最好的办法是添加 @OrderColumn对集合的注释。 Hibernate 将自动填充此列,其中 b1 为 0,b2 为 1,b3 为 2。当您重新加载父实体时,它们在列表中的顺序相同。

    关于Hibernate:@OrderBy vs @OrderColumn 维护集合的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11433195/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com