【问题标题】:Solution to N+1 issue in JPA and Hibernate with multiples Many-To-OneJPA 和 Hibernate 中 N+1 问题的多对一解决方案
【发布时间】:2021-08-26 17:22:59
【问题描述】:

我找到了一些避免 N+1 问题的解决方案,但该解决方案仅适用于单个多对一关系。

例如下面的问题:What is the solution for the N+1 issue in JPA and Hibernate?

我要解决的问题是:

@Entity 
public class Book implements Serializable { 
    
  @Id 
  private Long id; 

  private String title; 
    
  @ManyToOne(fetch = FetchType.LAZY) 
  private Author author; 

  @ManyToOne(fetch = FetchType.LAZY) 
  private Brand brand;
}

尝试通过 JPQL 获取的解决方案不起作用,只获取一个关系,例如:

SELECT b FROM Book b 
INNER JOIN FETCH b.author 
INNER JOIN FETCH b.brand

在这种情况下,只会获取“作者”关系,而“品牌”关系将发生 N+1 个问题。

您知道解决此特定问题的任何解决方案吗?

谢谢!

【问题讨论】:

    标签: java hibernate jpa join fetch


    【解决方案1】:

    用标准 api 试试这个:

    CritieriaBuilder cb = entityManager.getCriteriaBuilder();
    CriteriaQuery<Book> cq = cb.createQuery(Book.class);
    
    Root<Book> root = cq.from(Book.class);
    root.fetch("author"); //root.fetch(Book_.author) if use metamodel
    root.fetch("brand"); //root.fetch(Book_.brand) if use metamodel
    
    cq.select(root);
    
    List<Book> result = entityManager.createQuery(cq).getResultList();
    

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2013-10-19
      • 2020-08-21
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      相关资源
      最近更新 更多