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

9
我正在开发一个使用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(按照书名排序后,她的书“Letter A”排在第一位),然后是Andrew。
目前传递new Sort(Sort.Direction.ASC, "books.title")会得到“Barbara、Andrew、Andrew、Barbara”的结果列表,这意味着结果列表中有重复项 - 我希望结果是唯一的。
不想在作者集合上使用@OrderBy,因为我只对作者感兴趣,而不是实际的图书顺序。
不想使用@Query在存储库级别上对结果进行排序(可能可以使用某些JPQL子查询和虚拟字段),因为我需要它能够动态地接受可排序的字段(现在可能是标题,但在其他情况下可能是ISBN号码,我的API应该能够接受其中的一个)。
必须与我正在使用的Spring Specification API一起工作,以过滤结果。
这是否可能?

现在的结果是“Barbara,Andrew,Andrew,Barbara”,那么预期的输出是什么?我认为输出符合要求。 - dbl
1
我希望它是独一无二的,所以没有重复,只有 Barbara 然后是 Andrew,这将是整个列表(还在问题中添加了这一行)。 - Plebejusz
1
我认为这就是你所需要的 - findDistinctBy :https://stackoverflow.com/questions/48540789/select-distinct-as-query-method - dbl
您可以在此处查看给定线程中指向的Spring讨论:https://jira.spring.io/browse/DATAJPA-744 - dbl
您可以使用普通的findAll()获取作者,然后使用重写的Comparator将它们维护在TreeSet中。 - J.Kennsy
1个回答

5

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

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

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

这解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接