为什么 spring data jpa 不发出 JOIN 查询?
Why spring data jpa not issuing JOIN query?
我创建了两个具有一对多关系的实体 Book
和 Book_Category
。当我发出 BookCategoryRepository.findAll()
时,我希望 hibernate 使用 'INNER JOIN' 查询。但它只是发出查询以从 Book_Category.
获取数据
我错过了什么?我应该怎么做才能使休眠问题 JOIN 查询?
Book.java
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@ManyToOne
@JoinColumn(name = "book_category_id")
private BookCategory bookCategory;
}
BookCategory.java
@Entity
@Table(name = "book_category")
public class BookCategory {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@OneToMany(mappedBy = "bookCategory", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Book> books;
}
BookCategoryRepository.java
public interface BookCategoryRepository extends JpaRepository<BookCategory, Integer> {
}
bookCategoryRepository.findAll()
Hibernate 默认使用第二个查询来检索 child 集合。原因之一是适当的限制查询。否则,结果集中的行数将多于 1 侧的实体,如果至少有一个实体多于 1 child。
在休眠中存在更改此行为的注释,Spring Data Jpa 存储库将忽略该行为。注释为@Fetch(FetchMode.JOIN)
。如果您真的需要这种行为,您可以考虑 。
我创建了两个具有一对多关系的实体 Book
和 Book_Category
。当我发出 BookCategoryRepository.findAll()
时,我希望 hibernate 使用 'INNER JOIN' 查询。但它只是发出查询以从 Book_Category.
我错过了什么?我应该怎么做才能使休眠问题 JOIN 查询?
Book.java
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@ManyToOne
@JoinColumn(name = "book_category_id")
private BookCategory bookCategory;
}
BookCategory.java
@Entity
@Table(name = "book_category")
public class BookCategory {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private String name;
@OneToMany(mappedBy = "bookCategory", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Book> books;
}
BookCategoryRepository.java
public interface BookCategoryRepository extends JpaRepository<BookCategory, Integer> {
}
bookCategoryRepository.findAll()
Hibernate 默认使用第二个查询来检索 child 集合。原因之一是适当的限制查询。否则,结果集中的行数将多于 1 侧的实体,如果至少有一个实体多于 1 child。
在休眠中存在更改此行为的注释,Spring Data Jpa 存储库将忽略该行为。注释为@Fetch(FetchMode.JOIN)
。如果您真的需要这种行为,您可以考虑