java - 使用 Spring Data JPA 通过 @OneToMany 关系属性对实体进行排序
问题描述
我正在开发使用 Spring Data JPA 作为其持久层的 Spring Boot Web 应用程序。从存储库中检索实体时,我使用 Spring 的 Data JPASort
对象对它们进行排序。当我按检索到的实体属性或其@OneToOne 关系对象属性进行排序时,它可以工作,但我想用它来按@OneToMany 关系对象属性之一进行排序。
让我们用一个例子来解释一下:假设我有Author
一个与另一个实体有一对多关系的实体对象Book
。我的最简单形式的实体类如下所示:
@Entity
public class Author {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@OneToMany(mappedBy = "author")
private List<Book> books;
<constructor, getters, setters etc.>
}
和
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String title;
@ManyToOne
@JoinColumn(name = "author_id")
private Author author;
<constructor, getters, setters etc.>
}
现在,当我使用 Spring 的存储库接口检索作者时,我将 Sort 对象传递给它,如下所示:
new Sort(Sort.Direction.ASC, "id")
这给了我按作者 ID 升序排序的结果。我想通过这样的事情:
new Sort(Sort.Direction.ASC, "books.title")
假设我在数据库中有这些数据(简化表只是为了显示示例):
author | book_title
---------------------
Andrew | Letter C
Barbara | Letter A
Andrew | Letter B
Barbara | Letter D
结果列表将是 Barbara(她的书“字母 A”在按书名排序后排在第一位),然后是 Andrew。
现在通过new Sort(Sort.Direction.ASC, "books.title")
会导致“芭芭拉,安德鲁,安德鲁,芭芭拉”——这意味着结果列表中有重复项——我希望结果是不同的。
我不想在 Author 的收藏中使用@OrderBy
,因为我对实际的书籍订单不感兴趣 - 只有作者。
我不想在存储库级别使用 JPQL 对结果进行排序@Query
(可能有一些 JPQL 子查询和虚拟字段可能),因为我需要它能够动态接受可排序的文件(现在可能是标题,但 isbn其他情况下的编号,我的 API 应该能够采用其中一种)。
它必须与我用来过滤结果的 Spring Specification API 一起使用。
可能吗?
解决方案
我有同样的问题,但我找到了这个答案:
@OneToMany
@OrderBy("value ASC") // sort by value ASC
private List<PropertyDefinition> propertyDefinitions;
检查此链接中的答案: Spring Data JPA 对嵌套集合进行排序
它解决了我的问题。
推荐阅读
- python - 如何设置小部件以链接到 jupyternotebooks 的数组
- javascript - 在 html5 画布中渲染大量元素
- java - Oracle 数据库中 Java 的 TLS 版本
- neo4j - 如何在 Cypher 中合并然后排序两个列表?
- python - Python 和 Pandas 使用数据框创建多个动态 Excel 表
- .net - 正则表达式仅检测单个反斜杠并替换为双斜杠
- ios - UserDefault 未在主视图控制器中更新
- python - CUDA DLL 在 Conda 环境中不起作用
- javascript - 单击按钮时调用 Facebook 像素 fbq
- python - 将项目添加到列表字典的 Pythonic 方式