选择新的JPA Criteria查询API

use*_*613 2 sql jpa criteria criteria-api

我必须为一个用例构建一个Criteria Query,其输出就像..

从XXX x,YYY y中选择新的WrapperXXXYYY(XXX.something,YYY.something),其中x.id = y.createdBy和...

我创建的代码是..这里的域类只是其他两个Entity类的包装.

    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);
Run Code Online (Sandbox Code Playgroud)

我得到以下异常"javax.ejb.EJBException:java.lang.IllegalArgumentException:org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:新近第1行,第62列"

生成的查询是 - [从com选择新的com.collabnet.ctf.server.report.jpa.JPAReportList(new com.collabnet.ctf.server.report.jpa.JPAReportList(generatedAlias0.surrogateId,generatedAlias1.projectId)). collabnet.ctf.server.user.jpa.JPAUser as generatedAlias0,com.collabnet.ctf.server.report.jpa.JPAReport as generatedAlias1]

我看到domainClass有两个"新"语句,语法出了什么问题?

zbi*_*big 8

您可以使用以下两种方法之一使用Criteria实现构造函数表达式:

criteriaQuery.select(builder.construct(domainClass, user.get("surrogateId"), report.get("projectId")));
Run Code Online (Sandbox Code Playgroud)

要么

criteriaQuery.multiselect(user.get("surrogateId"), report.get("projectId"));
Run Code Online (Sandbox Code Playgroud)

使用construct()select()或使用multiselect() construct().您已经混合了这两种方法,最终得到了嵌套的构造函数表达式.