我必须为一个用例构建一个Criteria Query,其输出就像..
从XXX x,YYY y中选择新的WrapperXXXYYY(XXX.something,YYY.something),其中x.id = y.createdBy和...
我创建的代码是......这里的域类只是其他两个实体类的包装。
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<? extends T> criteriaQuery = builder.createQuery(domainClass);
Root<JPAUser> user = criteriaQuery.from(JPAUser.class);
Root<JPAReport> report = criteriaQuery.from(JPAReport.class);
criteriaQuery.multiselect(builder.construct(domainClass, user.get("surrogateId"), report.get("projectId")));
return em.createQuery(criteriaQuery);
我收到以下例外情况 “javax.ejb.EJBException:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:新近第1行,第62列”
生成的查询是 - [从com.collabnet.ctf.server中选择新的com.collabnet.ctf.server.report.jpa.JPAReportList(new com.collabnet.ctf.server.report.jpa.JPAReportList(generatedAlias0.surrogateId,generatedAlias1.projectId))。 user.jpa.JPAUser as generatedAlias0,com.collabnet.ctf.server.report.jpa.JPAReport as generatedAlias1]
我看到domainClass有两个“新”语句,语法出了什么问题?
答案 0 :(得分:8)
您可以通过以下两种方式之一使用Criteria实现构造函数表达式:
criteriaQuery.select(builder.construct(domainClass, user.get("surrogateId"), report.get("projectId")));
或
criteriaQuery.multiselect(user.get("surrogateId"), report.get("projectId"));
将construct()
与select()
一起使用,或使用multiselect()
,不用 construct()
。
您混合了这两种方法,最终得到了嵌套的构造函数表达式。