Java JPA子查询在SQL查询中生成ID twice
我在使用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,也不知道如何修复它,根据我找到并修改的示例,我认为这应该是可行的。 这是我第一次使用子查询,请原谅我的代码风格可能出现的愚蠢错误: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=?和
谢谢。我不知道您为什么要使用子查询 这种简单得多的方法将为您提供与给定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);