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

Ich*_*aki 2 java enums dao jpa criteria-api

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

这是我的查询:

final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class);
Run Code Online (Sandbox Code Playgroud)

MyClassDTO我有4个字段如下:

private String icon;
private String provenance;
private int sizeX;
private int sizeY;
Run Code Online (Sandbox Code Playgroud)

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

final Root<MyClass> from = query.from(MyClass.class);
Run Code Online (Sandbox Code Playgroud)

MyClass 有3个字段:

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

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

@Column
@Enumerated(EnumType.STRING)
private EnumSize enumSize;
Run Code Online (Sandbox Code Playgroud)

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

query.multiselect(
    from.get(MyClass_.enumTileIcon.toString()),
    from.get(MyClass_.enumProvenance.name()),
    from.get(MyClass_.enumSize.getWidth()),
    from.get(MyClass_.enumSize.getHeight())
);
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

pir*_*rho 11

我不确定multiselect的作用.但是在处理投影时,你可以使用它CriteriaBuilder.construct()

创建MyClassDTO喜欢的构造函数(如果需要,添加参数)

public MyClassDTO(EnumTileIcon icon, EnumProvenance provenance) {
    this.icon=icon.toString();
    this.provenance=provenance.toString();
}
Run Code Online (Sandbox Code Playgroud)

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

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")));
Run Code Online (Sandbox Code Playgroud)

然后你就可以得到

TypedQuery<MyClassDTO> tq = em.createQuery(cq);
Run Code Online (Sandbox Code Playgroud)