使用 Criteria API 获取并发表格

huangapple 未分类评论47阅读模式
英文:

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 中获取 AlerteDossierroot.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 = &quot;DOSSIER&quot;, schema = &quot;ADOP&quot;)
public class Dossier extends BaseAutoIncrementModel&lt;Integer&gt; implements BaseModelCode&lt;Integer&gt; {
...
}

Table 2: AlerteDossier

@Entity
@Table(name = &quot;ALERTE_DOSSIER&quot;, schema = &quot;ADOP&quot;)
public class AlerteDossier extends BaseAutoIncrementModel&lt;Integer&gt; implements BaseModelCode&lt;Integer&gt; {

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

    ...
}

Table 3: AlerteEnvoi

@Entity
@Table(name = &quot;ALERTE_ENVOI&quot;, schema = &quot;ADOP&quot;)
public class AlerteEnvoi extends BaseAutoIncrementModel&lt;Integer&gt; implements BaseModelCode&lt;Integer&gt; {

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

What I have atm:

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

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(&quot;alerteDossier&quot;, 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&lt;AlerteEnvoi, AlerteDossier&gt; fetchAlerteDossier = root.fetch(&quot;alerteDossier&quot;, JoinType.LEFT);
fetchAlerteDossier.fetch(&quot;dossier&quot;, JoinType.LEFT);

I'll be putting this answer as accepted once I've tested it out.

huangapple
  • 本文由 发表于 2020年5月4日 18:42:55
  • 转载请务必保留本文链接:https://java.coder-hub.com/61590355.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定