选择新的JPA Criteria查询API

时间:2014-09-15 04:00:43

标签: sql jpa criteria criteria-api

我必须为一个用例构建一个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有两个“新”语句,语法出了什么问题?

1 个答案:

答案 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()。 您混合了这两种方法,最终得到了嵌套的构造函数表达式。