Я работаю над веб-приложением Spring Boot, которое использует Spring Data JPA для своего уровня персистентности. При извлечении объектов из хранилища я использую объект 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")
, который дает мне результаты, отсортированные по возрастанию идентификатора автора. Я хотел бы передать что-то вроде этого:
new Sort(Sort.Direction.ASC, "books.title")
Допустим, у меня есть эти данные в базе данных (упрощенная таблица просто для примера):
author | book_title
---------------------
Andrew | Letter C
Barbara | Letter A
Andrew | Letter B
Barbara | Letter D
Получившийся список получит Барбара (ее книга «Буква А» - сначала после сортировки по названию книги), затем Эндрю.
Проход new Sort(Sort.Direction.ASC, "books.title")
прямо сейчас приводит к "Барбара, Эндрю, Эндрю, Барбара" - что означает, что в результирующем списке есть дубликаты - я хотел бы, чтобы результаты были различны.
Я не хочу использовать @OrderBy
для коллекции в Author, поскольку меня не интересует фактический порядок книг - только авторы.
Я не хочу сортировать результаты с JPQL на уровне хранилища с @Query
(возможно, это было бы возможно с некоторым подзапросом JPQL и виртуальным полем, возможно), так как мне нужно, чтобы он мог принимать Сортируемые файлы динамически (теперь это может быть заголовок, но номер isbn в другом случае и мой API должен быть в состоянии принять один или другой).
Он должен работать с API спецификации Spring, который я использую для фильтрации результатов.
Возможно ли это?