Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TopLink JPA子项在许多SQL';s对儿童的呼吁_Java_Jpa_Criteria_Toplink - Fatal编程技术网

Java TopLink JPA子项在许多SQL';s对儿童的呼吁

Java TopLink JPA子项在许多SQL';s对儿童的呼吁,java,jpa,criteria,toplink,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; @OneT

我对使用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;
...
}
@实体
@表(name=“T_测试A”)
@访问权限(AccessType.FIELD)
公共类TTestA实现可序列化{
@身份证
@列(name=“A_ID”)
私有字符串id;
@奥内托内
@PrimaryKeyJoinColumn
私密细节;
@OneToMany()
@JoinTable(name=“T\u TEST\u JOIN”,joinColumns=@JoinColumn(name=“TABLE\u FK”),inverseJoinColumns=@JoinColumn(name=“B\u ID”))
私人名单儿童;
...
}
@实体
@表(name=“T_测试”
@访问权限(AccessType.FIELD)
公共类TTestB实现可序列化{
@身份证
@列(name=“B_ID”)
私有字符串id;
@奥内托内
@PrimaryKeyJoinColumn
私密细节;
...
}
@实体
@表(name=“T\u TEST\u D”)
@访问权限(AccessType.FIELD)
公共类D实现可序列化{
@身份证
@列(name=“D_ID”)
私有字符串id;
@奥内托内
@PrimaryKeyJoinColumn
私人M更详细;
...
}
它基本上是一个使用3个表的一对多关系。使用CriteriaAPI,我能够在一个SQL中使用fetch从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);

    ...
final CriteriaBuilder cb=em.getCriteriaBuilder();
最终标准查询c=cb.createQuery(A.class);
最终根a=c.from(a.class);
a、 fetch(a.details).fetch(D.modeDetails);
a、 取回(儿童);
...

是否也可以“复合”对孩子的调用?

经过多次修改后,我注意到我还有另一个问题,那就是查询将返回重复的调用。 因此,我最终使用了a.join(a_.childrens,JoinType.LEFT).fetch(B_.details) 以及使用查询提示 query.setHint(QueryHints.FETCH,“t1.childrens”)
我设法消除了重复项,并获取了更深层次的数据。

经过多次修改后,我注意到我还有另一个问题,那就是查询将返回重复项。 因此,我最终使用了a.join(a_.childrens,JoinType.LEFT).fetch(B_.details) 以及使用查询提示 query.setHint(QueryHints.FETCH,“t1.childrens”) 我设法消除了重复项并获得了更深层次的信息