我正在研究使用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配合使用。
有可能吗?
答案 0 :(得分:0)
我有同样的问题,但是我找到了这个答案:
`@OneToMany
**@OrderBy("value ASC")** // sort by value ASC
private List<PropertyDefinition> propertyDefinitions;`
在此链接中查看答案: Spring Data JPA sorting on nested collection
它解决了我的问题。