Выражения свойств JPA Spring Data для запроса «многие ко многим» - PullRequest
0 голосов
/ 24 мая 2018

Я использую Spring boot 2, с данными Spring и Spring Data JPA, и я хочу заменить некоторые существующие @Query методы на Spring Data JPA Выражения свойств

Тем не менее, я изо всех сил пытаюсь найти имя выражения для отношений многих ко многим.Я не слишком уверен, возможно ли это, так как все примеры, которые я видел, основаны на отношении один-ко-многим.

Базовый пример может быть:

Book Entity

@Entity
@Table(name = "book")
public class Book {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "title")
    private String title;

    @ManyToMany(mappedBy = "authors", cascade = CascadeType.REFRESH, fetch = FetchType.LAZY)
    private Set<Author> authors = new HashSet<>();

    // Getter and Setters
}

Author Entity

@Entity
@Table(name = "Author")
public class Author {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "forename")
    private String firstName;

    @Column(name = "surname")
    private String surname;

    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinTable(
        name = "author_books",
        joinColumns = @JoinColumn(name = "author_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(name = "book_id", referencedColumnName = "id"),
        uniqueConstraints = @UniqueConstraint(columnNames = {"author_id", "book_id"})
    )
    private Set<Book> books = new HashSet<>();

    // Getter and Setters
}

Текущий запрос SQL выглядит примерно так:

SELECT *
FROM book
LEFT JOIN author_books ON author_books.book_id = book.id
WHERE author_books.author_id = 1;

Как бы вы написали эквивалентные выражения свойств JPA Spring (если это возможно) в репозитории Book?

Я пробовал следующее (без удачи):

List<Book> findByBooks_AuthorId(Long authorId);
List<Book> findByBooks_Author_Id(Long authorId);
List<Book> findByBooks_AuthorsId(Long authorId);
List<Book> findByBooks_Authors_Id(Long authorId);

Одно из решений будетчтобы получить объект автора по его идентификатору, а затем вызвать author.getBooks().Однако я хотел бы иметь возможность обеспечивать фильтрацию и разбивку на страницы результатов, используя классы данных PageRequest и Specification.

Любая помощь будет очень признательна.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

Вы можете попробовать это:

List<Book> findAllByAuthorId(Author author);
0 голосов
/ 24 мая 2018

вы пытались использовать аннотацию запроса .. https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.at-query

@Query("SELECT * FROM book LEFT JOIN author_books ON author_books.book_id = book.id WHERE author_books.author_id = ?1")
List<Book> findByBooks_AuthorId(Long authorId);
...