【问题标题】:TopLink JPA children fetch results in many SQL's calls for childrenTopLink JPA 子项在许多 SQL 对子项的调用中获取结果
【发布时间】:2014-05-15 04:12:13
【问题描述】:

我在使用 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,我可以在单个 SQL 中使用 fetch 获取第一级和所有一对一关系(级联)和来自 A 的子级,即 A=>D=>M,但我可以t 让孩子 B=>D=>M 采取同样的行动。

我最终得到一个获取 A、D、M 和 B 的 SQL 查询,但随后多个查询得到 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);

    ...

是否也可以“复合”孩子们的呼声?

【问题讨论】:

    标签: java jpa criteria toplink


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2020-11-22
      • 2019-11-25
      • 1970-01-01
      • 2023-03-25
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2013-11-09
      • 1970-01-01
      相关资源
      最近更新 更多