首页 > 解决方案 > 使用 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 一起使用。

可能吗?

标签: javasortingjpaspring-data-jpa

解决方案


我有同样的问题,但我找到了这个答案:

@OneToMany
@OrderBy("value ASC") // sort by value ASC
private List<PropertyDefinition> propertyDefinitions;

检查此链接中的答案: Spring Data JPA 对嵌套集合进行排序

它解决了我的问题。


推荐阅读