【发布时间】:2018-11-03 10:42:49
【问题描述】:
我正在使用带有 Spring Data 和 Spring Data JPA 的 Spring boot 2,我希望用 Spring Data JPA 的 Property Expressions 替换一些现有的 @Query 方法
但是,我正在努力锻炼多对多关系的表达式名称。我不太确定这是否可能,因为我看到的所有示例都是基于一对多关系的。
一个基本的例子可能是:
图书实体
@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
}
作者实体
@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;
您将如何在 Book 存储库中编写等效的 Spring JPA 属性表达式(如果可能)?
我尝试了以下方法(没有运气):
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);
一种解决方案是通过 id 获取作者对象,然后调用author.getBooks()。但是,我希望能够使用 spring 数据 PageRequest 和 Specification 类提供结果的过滤和分页。
任何帮助将不胜感激。
【问题讨论】:
标签: spring spring-data spring-data-jpa jpa-2.0