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