我创建了两个具有一对多关系的实体Book
和Book_Category
。当我发布BookCategoryRepository.findAll()
时,我希望hibernate使用'INNER JOIN'查询。但它刚刚发出查询以从Book_Category中获取数据。
我缺少什么?我应该怎么做才能使hibernate发出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()
答案 0 :(得分:6)
Hibernate默认使用第二个查询来检索子集合。其中一个原因是适当的限制查询。否则,如果至少一个具有多于1个子节点,则结果集中的行将比单侧的实体多。
存在一个注释来改变hibernate中的这种行为,Spring Data Jpa存储库会忽略它。注释为@Fetch(FetchMode.JOIN)
。如果您真的需要这种行为,可以考虑How does the FetchMode work in Spring Data JPA。