Criteria Builder在Select语句中创建新对象

use*_*052 16 java hibernate jpql criteria-api jpa-2.0

我想知道是否有可能创建这样的查询:

em.createQuery(
        "SELECT NEW EmpMenu(p.name, p.department.name) "
            + "FROM Project p ").getResultList();
Run Code Online (Sandbox Code Playgroud)

也可以通过规范来做到这一点:

public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
        CriteriaBuilder cb) {


    return ???;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Mik*_*unu 29

是的,Criteria API确实具有类似于JPQL构造函数表达式的构造.Resuls类是通过CriteriaBuilder中的construct方法设置的.

您表示为条件查询的JPQL查询是:

CriteriaBuilder cb...
CriteriaQuery<EmpMenu> q = cb.createQuery(EmpMenu.class);
  Root<Project> c = q.from(Project.class);
  q.select(cb.construct(EmpMenu.class,
      c.get("name"), c.get("department").get("name")));
Run Code Online (Sandbox Code Playgroud)

  • 好的,这正是我想要的!但现在我有另一个问题.我使用Spring Data和Specification来创建查询.从你的例子我看到我必须调用**q.select**,但是在规范中,select语句被自动调用(bcs你只需返回谓词).我有机会使用规范界面吗?或者我必须创建自己的存储库,调用EntityManage并创建查询.... (4认同)