具有非实体参数的 JPA 标准构造

Posted

技术标签:

【中文标题】具有非实体参数的 JPA 标准构造【英文标题】:JPA Criteria construct with non-entity parameter 【发布时间】:2015-04-09 15:02:20 【问题描述】:

我想创建一个复杂 DTO 对象列表,其中包含来自多个实体的数据和一个非实体参数。假设我的 DTO 类有构造函数:

public MyDto(String entityField, String someString) ...

我想使用CriteriaBuilder.construct 方法来创建我的列表,如下所示:

CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<MyDto> query = builder.createQuery(MyDto.class);
Root<MyEntity> root = query.from(MyEntity.class);
builder.construct(MyDto.class, root.get("entityField"), someString);
...

但我不允许这样做,因为construct 方法只需要我提供javax.persistence.criteria.Selection 参数。

问题:有没有一种方法可以使用 Criteria API 来做类似的事情(一次)?或者我需要先加载 MyEntity 对象并遍历它们并创建一个 DTO 列表(不是那么漂亮)?

【问题讨论】:

builder.literal(value) ? 谢谢!是的,这正是我要找的:) 【参考方案1】:

每次我有一个从不同实体收集字段的投影时,我都会使用这种方法,或者出于隐私原因,我不能返回一些数据(例如密码)

query.select(
    builder.construct(
      MyDto.class, 
      root.get("myfield"), // for field
      cb.literal(1), // for number
      cb.literal("blah blah")  // for string
));

【讨论】:

以上是关于具有非实体参数的 JPA 标准构造的主要内容,如果未能解决你的问题,请参考以下文章

标准 Jpa 选择外国实体

JPA:如何具有相同实体类型的一对多关系

如果连接列不包含某个值,JPA 标准构建器仅返回实体

在 Cython 中包装具有非标准类型作为参数的 C 函数

Spring-data-jpa介绍

标准 JPA 2,Hibernate - 多重连接