一尘不染

为什么Spring Data JPA不发出JOIN查询?

hibernate

我创建了两个实体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()

阅读 524

收藏
2020-06-20

共1个答案

一尘不染

默认情况下,Hibernate使用第二个查询来检索子集合。原因之一是适当的限制查询。否则,如果至少有一个以上的子对象,则结果集中的行将比1边的实体多。

有一个注释可以更改hibernate状态下的此行为,该注释将被Spring Data
Jpa存储库忽略。注释为@Fetch(FetchMode.JOIN)。如果确实需要此行为,则可以考虑FetchMode如何在Spring DataJPA中工作

2020-06-20