我在使用 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,但我可以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);
...
是否也可以“复合”孩子们的呼声?