如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO 类字符串字段?

Posted

技术标签:

【中文标题】如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO 类字符串字段?【英文标题】:How to populate DTO class string fields using JPA CriteriaQuery on Entity having enum fields? 【发布时间】:2018-05-04 17:04:25 【问题描述】:

我正在使用 JPA Criteria API,在我的查询多选中,我想检索一个枚举属性,而不是枚举本身。

这是我的查询:

final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class);

MyClassDTO我有4个字段如下:

private String icon;
private String provenance;
private int sizeX;
private int sizeY;

我从中检索数据的路径是:

final Root<MyClass> from = query.from(MyClass.class);

MyClass 有 3 个字段:

@Column
@Enumerated(EnumType.STRING)
private EnumTileIcon enumTileIcon;

@Column
@Enumerated(EnumType.STRING)
private EnumProvenance enumProvenance;

@Column
@Enumerated(EnumType.STRING)
private EnumSize enumSize;

我想做的是使用query.multiselect 填充MyClassDTO,如下所示:

query.multiselect(
    from.get(MyClass_.enumTileIcon.toString()),
    from.get(MyClass_.enumProvenance.name()),
    from.get(MyClass_.enumSize.getWidth()),
    from.get(MyClass_.enumSize.getHeight())
);

我该如何解决这个问题?

【问题讨论】:

我认为您必须为此使用元组查询。 @Antoniossss 我该怎么做? builder.createQuery(Tuple.class); 【参考方案1】:

我不确定多选的作用。但是在处理 projections 时,您可以使用 CriteriaBuilder.construct()

MyClassDTO一样创建构造函数(如果需要,添加参数)

public MyClassDTO(EnumTileIcon icon, EnumProvenance provenance) 
    this.icon=icon.toString();
    this.provenance=provenance.toString();

在查询中调用构造函数(如果需要,添加获取参数以匹配构造函数参数)

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<MyClassDTO> cq = cb.createQuery(MyClassDTO.class);
Root<MyClass> root = cq.from(MyClass.class);
cq.select(cb.construct(MyClassDTO.class,
             root.get("enumTileIcon"), root.get("enumProvenance")));

那么你就可以得到

TypedQuery<MyClassDTO> tq = em.createQuery(cq);

【讨论】:

以上是关于如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO 类字符串字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用查询而不是带有 JPA 的 @JoinColumn 映射实体关联?

如何使用 JPA 初始化表示其插入数据库的日期时间的实体字段?

如何在 JPA 中映射名称为保留字的实体字段

jpa 实体bean中如何定义非映射字段

如何使用 JPA 和 Spring 在列表中查找具有字段的不同行?

如何克隆 JPA 实体