英文:
Fetch concurrent tables with Criteria API
问题
我有3个实体类:
(BaseAutoIncrementModel
包含每个实体的id声明)
表1:Dossier
@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;
...
}
我目前有:
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 创建一个选择语句,以便在 AlerteDossier
实体中也加载 Dossier
。
如果 AlerteDossier
是惰性加载的,我知道如何在 AlerteEnvoi
中获取 AlerteDossier
(root.fetch("alerteDossier", JoinType.LEFT)
),但我不知道如何获取子实体的子实体。有人能帮我解决这个问题吗?
英文:
I've got 3 entity classes:
(The BaseAutoIncrementModel
contains the declaration of the id for each entity)
Table 1: Dossier
@Entity
@Table(name = "DOSSIER", schema = "ADOP")
public class Dossier extends BaseAutoIncrementModel<Integer> implements BaseModelCode<Integer> {
...
}
Table 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;
...
}
Table 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;
...
}
What I have 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<>();
...
As you can see in AlerteEnvoi
the AlerteDossier
table is eagerly loaded, though in AlerteDossier
the Dossier
table is lazily loaded.
I need to create, using the Criteria Api, a select statement for AlerteEnvoi
where Dossier
would also be loaded within the AlerteDossier
entity.
I know how I'd need to fetch the AlerteDossier
within the AlerteEnvoi
if AlerteDossier
would be lazily-loaded (root.fetch("alerteDossier", JoinType.LEFT
), I've got no clue how to fetch a sub-entity of a sub-entity though. Anyone can help me with this?
答案1
得分: 0
我还没有进行测试,但从同事那里听说应该可以这样做:
Fetch<AlerteEnvoi, AlerteDossier> fetchAlerteDossier = root.fetch("alerteDossier", JoinType.LEFT);
fetchAlerteDossier.fetch("dossier", JoinType.LEFT);
我会在测试之后将此答案标记为已接受。
英文:
I haven't tested it out yet, but heard from a collegue something like this should be do-able:
Fetch<AlerteEnvoi, AlerteDossier> fetchAlerteDossier = root.fetch("alerteDossier", JoinType.LEFT);
fetchAlerteDossier.fetch("dossier", JoinType.LEFT);
I'll be putting this answer as accepted once I've tested it out.
专注分享java语言的经验与见解,让所有开发者获益!
评论