使用 Spring Data JPA 通过 @OneToMany 关系属性对实体进行排序

Ple*_*usz 9 java sorting jpa spring-data-jpa

我正在开发使用 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.>
}
Run Code Online (Sandbox Code Playgroud)

@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.>
}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用 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
Run Code Online (Sandbox Code Playgroud)

结果列表将是芭芭拉(她的书“字母 A”是按书名排序后的第一个)然后是安德鲁。

路过new Sort(Sort.Direction.ASC, "books.title")现在导致“芭芭拉,安德鲁,安德鲁,芭芭拉” -这意味着有在结果列表重复-我想结果是不同的。

希望使用@OrderBy中笔者就收集,因为我不是真正的图书感兴趣秩序-只有作者。

不想在存储库级别使用 JPQL 对结果进行排序@Query(使用某些 JPQL 子查询和虚拟字段可能是可能的),因为我需要它能够动态接受可排序的文件(现在可能是标题,但 isbn其他情况下的编号,我的 API 应该能够采用其中一种)。

必须与我用来过滤结果的 Spring Specification API 一起使用。

是否可以?

小智 5

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

@OneToMany
@OrderBy("value ASC") // sort by value ASC
private List<PropertyDefinition> propertyDefinitions;
Run Code Online (Sandbox Code Playgroud)

检查此链接中的答案: Spring Data JPA Sorting on Nested Collection

它解决了我的问题。