Я использую 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
.
Любая помощь будет очень признательна.