如何在具有枚举字段的实体上使用 JPA CriteriaQuery 填充 DTO class 字符串字段?
How to populate DTO class string fields using JPA CriteriaQuery on Entity having enum fields?
我正在使用 JPA 标准 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())
);
我该如何解决这个问题?
我不确定多选的作用。但是在处理 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 标准 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())
);
我该如何解决这个问题?
我不确定多选的作用。但是在处理 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);