首页 > 解决方案 > JPA Hibernate N+1 问题,即使使用 Join Fetch

问题描述

我对 JPA、Java 和 Hibernate 还很陌生,所以请耐心等待。

我有一个这样的 JPA 存储库:

@Repository
public interface OrderRepository extends JpaRepository<VPLabOrderLite, Integer> {
  @Query(
      "select o from VPLabOrderLite o "
          + "inner join fetch o.stay s "
          + "inner join fetch  s.patient p "
          + "left join fetch o.orderedTests t "
          + "left join fetch t.result r "
          + "where p.id = :maAccession")
  List<VPLabOrderLite> getOrders(@Param("maAccession") String maAccession);
}

问题是,当涉及到 t.result 上的最后一个连接提取时,它将为 o.orderedTests t 的每个实例生成一个返回到数据库的 sql 查询。这似乎与 t.result 属性上具有 @JoinColumns 属性的事实有关,因为当我将其更改为单个 @JoinColumn 属性时,其他查询消失(但连接的含义丢失了,所以我需要加入多个列)

这是 OrderedTest 实体中的结果属性

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumns({
    @JoinColumn(
        name = "orderNo",
        referencedColumnName = "orderId",
        insertable = false,
        updatable = false),
    @JoinColumn(
        name = "testId",
        referencedColumnName = "testId",
        insertable = false,
        updatable = false)
 })
  private VPLabTestResultLite result;

我如何摆脱不需要的额外查询?

标签: javahibernatejpa

解决方案


推荐阅读