我有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
,但我不知道如何获取子目录的子实体。虽然实体。有人可以帮我吗? 最佳答案
我还没有测试过,但是从同事那里听到这样的消息应该可行:
Fetch<AlerteEnvoi, AlerteDossier> fetchAlerteDossier = root.fetch("alerteDossier", JoinType.LEFT);
fetchAlerteDossier.fetch("dossier", JoinType.LEFT);
测试完成后,我将把这个答案接受。