JPA JOIN FETCH查询未加载数据

时间:2018-06-19 10:31:46

标签: java jpa criteria-api openjpa

我有一个从BpBpHistorisiert的懒惰1:n关系,而且我没有告诉JPA急切地加载这个问题。

我有一个条件查询执行获取联接以与BpHistorisiert一起加载Bp

不幸的是它没有工作,根本没有加载BpHistorisiert个实例。 bpHistorisiertList Bp中的SELECT * FROM Bp b LEFT JOIN FETCH b.bpHistorisiertList 为空。

这是由条件API生成的JPQL查询:

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; 

JPA正在生成此SQL查询:

@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<>();

}

如果我在DB中执行此查询,我会获得正确的数据。

BP

@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;

}

BpHistorisiert

    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();

查询

test

1 个答案:

答案 0 :(得分:0)

这毕竟是一个持久性上下文实时循环问题。实体定义和条件查询都很好。

背景

我们手工制作的test-JEE容器在这种特殊情况下不会清除持久性上下文。此外,DB初始化代码未设置Bp和BpHistorisert之间的双向关系的两端。这导致实体管理器从持久性上下文处理断开的Bp到BpHistorisert关系,而不是从数据库从头开始读取所有内容。