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 作为这个 DTO 的一个字段。标准构建器 .construct() 工作正常,但我需要 select 语句在我的自定义对象中创建一个列表。我在网上没有找到有关如何执行此操作的信息。如果路过的人知道答案,将不胜感激,谢谢 是否可以将值设置为自定义 bean 类的列表字段 当我的实体具有 jsonb 类型字段时,我无法使用自定义构造。 “无法在...上找到适当的构造函数”字段类型 jsonb 被替换为真正的类。

以上是关于Criteria Builder 在 Select 语句中创建新对象的主要内容,如果未能解决你的问题,请参考以下文章

Criteria Builder 和 Jquery DataTables - 自定义查询

如何将distinct应用于特定列并从JPA中的表中获取所有值(Criteria Builder)

在 Criteria 中使用 Select 和 where 语句

Yii criteria操作方法集合

Yii CDbCriteria类中方法

JPA Criteria Query distinct