TopLink JPA 子项获取结果导致许多 SQL 对子项的调用


我遇到了使用

JPA构建的模型生成的SQL的问题(TopLink(我们有以下几点

@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 表关系的一对多。使用标准 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);
    ...

有没有可能"复合"对孩子的呼唤?

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

相关内容

  • 没有找到相关文章

最新更新