代码之家  ›  专栏  ›  技术社区  ›  BetaRide

jpa join fetch查询未加载数据

  •  0
  • BetaRide  · 技术社区  · 8 年前

    我有一个懒散的1:n关系 Bp BpHistorisiert 我没能告诉JPA急切地把这件事付诸实践。

    我有一个条件查询,它执行一个fetch连接来加载 历史学者 一起 血压 .

    不幸的是它不起作用,不 历史学者 实例已加载。这个 bpHistorisiertList 进入 血压 雷曼是空的。

    这是由criteria api生成的jpql查询:

    SELECT * FROM Bp b LEFT JOIN FETCH b.bpHistorisiertList
    

    jpa正在生成这个sql查询:

    SELECT t0.id, 
           t6.bp_id, 
           t6.id, 
    FROM   infop_stammdaten.bp t0 
           LEFT OUTER JOIN infop_stammdaten.bp_historisiert t6 
                        ON t0.id = t6.bp_id 
    ORDER  BY t6.bp_id ASC; 
    

    如果我在数据库中执行这个查询,我会得到正确的数据。

    血压

    @Entity
    @Table(name = "BP", schema = "INFOP_STAMMDATEN")
    public class Bp extends BaseEntity implements EntityId, Serializable {
    
        /** technische ID */
        @Id
        @Column(name = ID)
        private Long id;
    
        @Valid
        @OneToMany(mappedBy = "bp", orphanRemoval = false, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
        private List<BpHistorisiert> bpHistorisiertList = new ArrayList<>();
    
    }
    

    历史学者

    @Entity
    @Table(name = "BP_HISTORISIERT", schema = "INFOP_STAMMDATEN")
    public class BpHistorisiert implements EntityId, GueltigkeitOwner, AbkuerzungOwner, Serializable {
    
        @Id
        @Column(name = ID)
        private Long id;
    
        @NotNull
        @ManyToOne
        @JoinColumn(name = BP_ID)
        @ForeignKey
        private Bp bp;
    
    }
    

    查询

        CriteriaBuilder builder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Bp> bpQuery = builder.createQuery(Bp.class);
        Root<Bp> fromBp = bpQuery.from(Bp.class);
        fromBp.fetch(Bp_.bpHistorisiertList, JoinType.LEFT);
        List<Bp> bpList = entityManager.createQuery(bpQuery).getResultList();
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   BetaRide    8 年前

    在所有这些都被证明是持久性上下文生命周期问题之后。实体定义和条件查询非常好。

    背景

    我们手工测试的JEE容器在这个特定的情况下没有清除持久性上下文。此外,DB初始化代码没有设置bp和BpHistorisert之间的双向关系的两侧。这导致了实体管理器从持久化上下文中使用一个破碎的BP到BpHistorisert关系,而不是从头开始从DB中读取所有内容。