【问题标题】:Why spring data jpa not issuing JOIN query?为什么 spring data jpa 不发出 JOIN 查询?
【发布时间】:2016-07-29 02:23:06
【问题描述】:

我创建了两个具有一对多关系的实体BookBook_Category。当我发出BookCategoryRepository.findAll() 时,我希望hibernate 使用'INNER JOIN' 查询。但它只是发出查询以从 Book_Category 中获取数据。

我错过了什么?我应该怎么做才能使hibernate issue 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()

【问题讨论】:

  • 加入是因为你在实体上拥有它。实体 BookCategory 也有一套书,所以当你做 findAll() 时,你也应该收到一套书。你想在这里实现什么。如果你真的需要在查询中看到 JOIN,你可以写一个@query。
  • Hibernate 仅发出 select * from Book_category。我希望它发出 select * from book_Category inner join Book b。我已经将 FetchType 设置为渴望。所以我不想使用@Query。
  • @GrinishNepal @query 也没有处理这种情况。

标签: hibernate spring-data-jpa


【解决方案1】:

Hibernate 默认使用第二个查询来检索子集合。一个原因是适当的限制查询。否则,如果至少一个有超过 1 个子项,则结果集中的行数将多于 1 侧的实体。

在 Hibernate 中存在一个注释来改变这种行为,它被 Spring Data Jpa 存储库忽略。注释是@Fetch(FetchMode.JOIN)。如果你真的需要这种行为,你可以考虑How does the FetchMode work in Spring Data JPA

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    • 2014-06-20
    • 2021-12-22
    • 1970-01-01
    相关资源
    最近更新 更多