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

标签 java jpa enums dao criteria-api

我正在使用 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())
);

我该如何解决这个问题?

最佳答案

我不确定多选的作用。但是,在处理投影时,您可以使用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);

关于java - 如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO 类字符串字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47409619/

相关文章:

java - 在没有其他模块提供该实例的情况下提供实例

java - 每行分割未知数量的字符串

java - JComboBox + JPA

java - 获取持久性单元名称

java - 用对象包裹集合属性

c - #if 与枚举一起使用

java - TextView if 语句不起作用

java - Java中的大类分解

c# - 为什么将存储在对象中的枚举转换为 int 会返回一个字符串?

json - 来自 JSON 字符串的 typescript `enum`