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 JPA子查询在SQL查询中生成ID twice_Java_Jpa_Subquery_Criteria Api - Fatal编程技术网

Java JPA子查询在SQL查询中生成ID twice

Java JPA子查询在SQL查询中生成ID twice,java,jpa,subquery,criteria-api,Java,Jpa,Subquery,Criteria Api,我在使用JPA CriteriaQuery进行复合选择时遇到问题。 我有三个表X->Y->Z,对于每个X我有一个或多个Y,对于每个Y我有一个或多个Z。我有一个X对象,我试图为一个X选择所有出现的Z 我正在使用的代码: Xid和Yid是它们各自的Y和Z bean中的外键 此代码在执行点生成错误,因为我有无效的SQL: 选择t0.Z列1、t0.Z列2、t0.Z列3, 从Z t0开始,其中t0.Yid在选择中 t1.Yid.t1.Yid来自Y t1,其中t1.Xid=? 和t0.Zcolumn1=?和

我在使用JPA CriteriaQuery进行复合选择时遇到问题。 我有三个表X->Y->Z,对于每个X我有一个或多个Y,对于每个Y我有一个或多个Z。我有一个X对象,我试图为一个X选择所有出现的Z

我正在使用的代码:

Xid和Yid是它们各自的Y和Z bean中的外键

此代码在执行点生成错误,因为我有无效的SQL:

选择t0.Z列1、t0.Z列2、t0.Z列3, 从Z t0开始,其中t0.Yid在选择中 t1.Yid.t1.Yid来自Y t1,其中t1.Xid=? 和t0.Zcolumn1=?和t0.Zcolumn2=?t0.Zcolumn3 ASC订购

我不明白为什么子查询会生成两次Yid,也不知道如何修复它,根据我找到并修改的示例,我认为这应该是可行的。 这是我第一次使用子查询,请原谅我的代码风格可能出现的愚蠢错误:


谢谢。

我不知道您为什么要使用子查询

这种简单得多的方法将为您提供与给定X实例链接的所有Z发生率。我稍微更改了字段名称:ysCollection和zsCollection分别是X和Y中的OneToMany属性,如下所示:

@Entity
public class X {
    ...
    @OneToMany(mappedBy="xId")
    private List<Y> ysCollection;
    ...
}
如果我误解了你的目标,请告诉我:

X xObj;
CriteriaQuery<Z> cq = cb.createQuery(Z.class);
Root<X> root = cq.from(X.class);
Join<X, Y> ys = root.join("ysCollection");
Join<Y, Z> zs= ys.join("zsCollection");
cq.distinct(true);
cq.where(cb.equal(root.get("id"), xObj.getId()));
cq.select(zs);
或者,使用元模型:

X xObj;
CriteriaQuery<Z> cq = cb.createQuery(Z.class);
Root<X> root = cq.from(X.class);
Join<X, Y> ys = root.join(X_.ysCollection);
Join<Y, Z> zs= ys.join(Y_.zsCollection);
cq.distinct(true);
cq.where(cb.equal(root.get(X_.id), xObj.getId()));
cq.select(zs);

不应该Subquery Subquery=criteriaQuery.subqueryY.class;be Subquery Subquery=criteriaQuery.SubQueryId.class;?Yid,它不是一个类,我使用的符号可能有点混乱,Y它是一个类,Yid是Z和X中的外键,Y中的主键。外键只用于Z。。。好的,你必须向我解释什么是ysCollection和zsCollection。
X xObj;
CriteriaQuery<Z> cq = cb.createQuery(Z.class);
Root<X> root = cq.from(X.class);
Join<X, Y> ys = root.join(X_.ysCollection);
Join<Y, Z> zs= ys.join(Y_.zsCollection);
cq.distinct(true);
cq.where(cb.equal(root.get(X_.id), xObj.getId()));
cq.select(zs);