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

时间:2013-09-23 20:27:53

标签: java jpa criteria toplink

我在使用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 =&gt; D =&gt; M,但是我不能让孩子B =&gt; D =&gt; M行为相同。

我最终获得了一个获得A,D,M和B的SQL查询,但后来又有多个查询得到B =&gt; D =&gt; 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);

    ...

是否可以“复合”儿童的电话?

1 个答案:

答案 0 :(得分:1)

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