【问题标题】:Criteria Builder Create new Object In Select StatementCriteria Builder 在 Select 语句中创建新对象
【发布时间】: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 ???;
}

提前致谢!

【问题讨论】:

  • 我个人不知道答案,但你试一试了吗?

标签: java hibernate jpa-2.0 jpql criteria-api


【解决方案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 被替换为真正的类。
猜你喜欢
  • 2012-12-28
  • 2020-11-08
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2021-01-28
  • 1970-01-01
  • 2017-02-22
相关资源
最近更新 更多