gpt4 book ai didi

java - TopLink JPA 子项在许多 SQL 子项调用中获取结果

转载 作者:太空宇宙 更新时间:2023-11-04 07:23:15 25 4
gpt4 key购买 nike

我在使用 JPA (TopLink) 构建的模型中生成的 SQL 时遇到问题我们有以下内容

@Entity
@Table(name = "T_TEST_A")
@Access(AccessType.FIELD)
public class TTestA implements Serializable {

@Id
@Column(name = "A_ID")
private String id;

@OneToOne
@PrimaryKeyJoinColumn
private D detail;


@OneToMany()
@JoinTable(name = "T_TEST_JOIN", joinColumns = @JoinColumn(name = "TABLE_FK"), inverseJoinColumns = @JoinColumn(name = "B_ID"))
private List<B> childrens;
...
}

@Entity
@Table(name = "T_TEST_B")
@Access(AccessType.FIELD)
public class TTestB implements Serializable {

@Id
@Column(name = "B_ID")
private String id;

@OneToOne
@PrimaryKeyJoinColumn
private D detail;
...
}

@Entity
@Table(name = "T_TEST_D")
@Access(AccessType.FIELD)
public class D implements Serializable {

@Id
@Column(name = "D_ID")
private String id;

@OneToOne
@PrimaryKeyJoinColumn
private M moreDetail;
...
}

它基本上是使用 3 个表关系的一对多。使用 Criteria API,我能够使用 fetch 在单个 SQL 中获取第一级和所有一对一关系(级联)和 A 的子级,即 A=>D=>M,但我无法让子级 B=>D=>M 执行相同的操作。

我最终得到一个 SQL 查询,该查询获取 A、D、M 和 B,但随后通过多个查询获取 B=>D=>M。

这就是我所做的:

    final CriteriaBuilder cb = em.getCriteriaBuilder();
final CriteriaQuery<A> c = cb.createQuery(A.class);
final Root<A> a = c.from(A.class);
a.fetch(A_.details).fetch(D_.modeDetails);
a.fetch(A_.childrens);

...

是否也可以“复合” children 的呼唤?

最佳答案

经过多次摆弄,我注意到我还有另一个问题,那就是查询会返回重复项。所以我最终使用了 a.join(A_.childrens, JoinType.LEFT).fetch(B_.details)并使用查询提示query.setHint(QueryHints.FETCH, "t1.childrens")我设法消除了重复项并获取更深层次的内容。

关于java - TopLink JPA 子项在许多 SQL 子项调用中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18968228/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com