基于可编辑位置属性的 Spring Data JPA 自动排序行

Posted

技术标签:

【中文标题】基于可编辑位置属性的 Spring Data JPA 自动排序行【英文标题】:Spring Data JPA auto ordering rows based on editable position property 【发布时间】:2020-05-17 16:44:20 【问题描述】:

我正在 Kotlin 中使用 Spring Boot 构建一个简单的 ToDo 应用程序。我都是新手。以下是数据类,我用来通过 JPA 将数据持久化到 mysql 数据库中。

@Entity @Table
data class Task(
        @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column val id: Long,
        @Column var title: String,
        @Column var isCompleted: Boolean
)

这是 JPA 存储库。

@Repository interface TaskRepository: JpaRepository<Task, Long>

用户可以有一个任务列表。

我有两个要求,首先是当用户添加一个新任务时,它必须添加到列表的末尾,这意味着当我从数据库中检索时,我需要按照保存的顺序来保存列表。我想通过添加如下所示的位置属性来实现这一点,该属性会自动递增。建议是否有更好的选择。创建的基于时间的排序不符合我的其他要求。

@GeneratedValue(strategy = GenerationType.SEQUENCE)
@Column var position: Int

第二个要求是用户可以重新安排任务。例如,用户可以将第 8 个位置的任务移动到第 2 个位置。为此,我正在考虑将每个任务的位置从 2 增加到 7,然后将所选任务的位置更改为 2。

我不知道如何通过单个查询来实现这一点。这甚至可能吗?这是正确的做法吗?

此外,如果用户删除了一项任务,理想情况下,我希望将所有任务的位置减一。但如果它很昂贵,我可以不用它。

我真的很喜欢 Spring Boot 对配置设计的约定,所以我希望一定有一种更简单、更好的方法来满足我的要求。

【问题讨论】:

第二部分可以使用case语句。你不是第一个想要这样做的人。 @Strawberry 我清楚地知道我不是第一个想要这样做的人。这就是为什么我要问是否有经过验证的更好方法? 有关于如何改变任务位置的消息吗? 【参考方案1】:

此类功能是 JPA 规范的一部分,可以使用 @OrderColumn 注释来实现。

https://docs.jboss.org/hibernate/jpa/2.1/api/javax/persistence/OrderColumn.html

指定一个列,用于维护一个列的持久顺序 列表。持久性提供者负责维护 在检索和数据库中订购。 持久性提供程序是 负责在刷新到数据库时更新排序到 反映影响列表的任何插入、删除或重新排序

因此,您可以简单地定义一个从 User 到 Task 的 @OneToMany,使用这个附加注释,JPA 提供程序将根据您对列表的操作来维护持久的 order 列。

【讨论】:

以上是关于基于可编辑位置属性的 Spring Data JPA 自动排序行的主要内容,如果未能解决你的问题,请参考以下文章

x-触发元素的可编辑访问属性值

SpringBoot+Spring Data JPA整合H2数据库

SpringBoot+Spring Data JPA整合H2数据库

Spring Data 系列 Spring+JPA入门

Spring boot , Spring data JPA 并发访问

可编辑DIV 光标位置 处理