Сортировка сущностей по их свойству отношения @OneToMany с помощью Spring Data JPA - PullRequest
0 голосов
/ 04 сентября 2018

Я работаю над веб-приложением 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, который я использую для фильтрации результатов.

Возможно ли это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...