使用Criteria API获取并发表

问题描述 投票:0回答:1

我有3个实体类:(BaseAutoIncrementModel包含每个实体ID的声明)

表1:档案

@Entity
@Table(name = "DOSSIER", schema = "ADOP")
public class Dossier extends BaseAutoIncrementModel<Integer> implements BaseModelCode<Integer> {
...
}

表2:AlerteDossier

@Entity
@Table(name = "ALERTE_DOSSIER", schema = "ADOP")
public class AlerteDossier extends BaseAutoIncrementModel<Integer> implements BaseModelCode<Integer> {

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "FK_DOSSIER")
    private Dossier dossier;

    ...
}

表3:AlerteEnvoi

@Entity
@Table(name = "ALERTE_ENVOI", schema = "ADOP")
public class AlerteEnvoi extends BaseAutoIncrementModel<Integer> implements BaseModelCode<Integer> {

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "FK_ALERTE_DOSSIER")
    private AlerteDossier alerteDossier;

    ...
}

我有atm:

CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<AlerteEnvoi> query = builder.createQuery(AlerteEnvoi.class);
Root<AlerteEnvoi> root = query.from(AlerteEnvoi.class);
query.select(root);
List<Predicate> predicateList = new ArrayList<>();
...

正如您在AlerteEnvoi中看到的,尽管AlerteDossier表中的AlerteDossier表是延迟加载的,但是Dossier表中的加载是急切的。

我需要使用Criteria Api为AlerteEnvoi创建一条select语句,其中Dossier也将被加载到AlerteDossier实体中。我知道如果AlerteDossier会被延迟加载(AlerteEnvoi),那么我需要如何在AlerteDossier中获取root.fetch("alerteDossier", JoinType.LEFT,但我不知道如何获取子C的子实体。实体。有人可以帮助我吗?

java criteria-api
1个回答
0
投票

我还没有测试过,但是从同事那里听到这样的事应该是可行的:

Fetch<AlerteEnvoi, AlerteDossier> fetchAlerteDossier = root.fetch("alerteDossier", JoinType.LEFT);
fetchAlerteDossier.fetch("dossier", JoinType.LEFT);

测试完成后,我将把这个答案视为接受。

© www.soinside.com 2019 - 2024. All rights reserved.