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

时间:2018-09-04 14:17:14

标签: java sorting jpa spring-data-jpa

我正在研究使用Spring Data JPA作为持久层的Spring Boot Web应用程序。当从存储库中检索实体时,我正在使用Spring的Data JPA Sort对象对它们进行排序。当我按检索到的实体属性或@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

结果列表将是芭芭拉(她的书“字母A”在按书名排序后首先显示),然后是安德鲁。

现在通过new Sort(Sort.Direction.ASC, "books.title")会导致“ Barbara,Andrew,Andrew,Barbara”-这意味着结果列表中存在重复项-我希望结果是不同的。

不想不想在作者的藏书中使用@OrderBy,因为我对实际的图书订购顺序不感兴趣-仅对作者感兴趣。

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

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

有可能吗?

1 个答案:

答案 0 :(得分:0)

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

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

在此链接中查看答案: Spring Data JPA sorting on nested collection

它解决了我的问题。