Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA联接获取查询未加载数据_Java_Jpa_Criteria Api_Openjpa - Fatal编程技术网

Java JPA联接获取查询未加载数据

Java JPA联接获取查询未加载数据,java,jpa,criteria-api,openjpa,Java,Jpa,Criteria Api,Openjpa,我有一个从Bp到BpHistorisiert的惰性1:n关系,我没有告诉JPA急切地加载此不动产 我有一个条件查询,它执行fetch连接以加载BpHistorisiert和Bp 不幸的是,它不工作,根本没有加载BpHistorisiert实例。Bpreamins中的bpHistorisiertList为空 这是由criteria API生成的JPQL查询: SELECT * FROM Bp b LEFT JOIN FETCH b.bpHistorisiertList JPA正在生成以下SQL查

我有一个从
Bp
BpHistorisiert
的惰性1:n关系,我没有告诉JPA急切地加载此不动产

我有一个条件查询,它执行fetch连接以加载
BpHistorisiert
Bp

不幸的是,它不工作,根本没有加载
BpHistorisiert
实例。
Bp
reamins中的
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; 
如果我在数据库中执行这个查询,我会得到正确的数据

Bp

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

}
查询

    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();
CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery bpQuery=builder.createQuery(Bp.class);
Root fromBp=bpQuery.from(Bp.class);
fromBp.fetch(Bp_u2;.bpHistorisiertList,JoinType.LEFT);
List bpList=entityManager.createQuery(bpQuery.getResultList();

毕竟,这是一个持久性上下文生命周期问题。实体定义和条件查询非常好

背景


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

我不明白会发生什么。您可以说,当您手动执行生成的语句时,您确实获得了数据,但是集合是空的。这是对的,还是会发生什么?是的。我确实得到了一个
Bp
s的列表,但所有
bpHistorisiertList
s都保持为空。空与未初始化不同。您的意思是,当您访问该列表时,它是空的,还是说当您访问该列表时,它被延迟加载?如果它真的是空的,也许您应该启用跟踪日志记录()?它是一个ArrayList代理。当我访问它时,不会加载任何内容,其大小为0。
    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();