Criteria Builder 在 Select 语句中创建新对象
Posted
技术标签:
【中文标题】Criteria Builder 在 Select 语句中创建新对象【英文标题】:Criteria Builder Create new Object In Select Statement 【发布时间】:2012-11-04 05:21:49 【问题描述】:我想知道是否可以创建这样的查询:
em.createQuery(
"SELECT NEW EmpMenu(p.name, p.department.name) "
+ "FROM Project p ").getResultList();
也可以通过规范来做到这一点:
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query,
CriteriaBuilder cb)
return ???;
提前致谢!
【问题讨论】:
我个人不知道答案,但你试一试了吗? 【参考方案1】:是的,Criteria API 确实具有类似于 JPQL 构造函数表达式的构造。结果类通过 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")));
【讨论】:
好,这正是我想要的!但现在我有另一个问题。我使用 Spring Data and Specification 来创建查询。从您的示例中,我看到我必须调用 q.select ,但在规范中选择语句会自动调用(bcs 您只需返回谓词)。我有机会使用规范界面来做到这一点吗?或者我必须创建自己的存储库,调用 EntityManage 并创建查询.... 是否可以在construct() 方法中指定一个可选值?就像使用 LEFT OUTER JOIN 一样,我想在选择一个字段中检索,并且即使该字段为空也创建对象。 我有一个由几个字段组成的 DTO,我最近添加了一个 List以上是关于Criteria Builder 在 Select 语句中创建新对象的主要内容,如果未能解决你的问题,请参考以下文章
Criteria Builder 和 Jquery DataTables - 自定义查询
如何将distinct应用于特定列并从JPA中的表中获取所有值(Criteria Builder)