[英]How to populate DTO class string fields using JPA CriteriaQuery on Entity having enum fields?
I'm using JPA Criteria API, and in my query multiselect I want to retrieve an enum attribute, and not the enum itself. 我正在使用JPA Criteria API,在我的查询多选中我想要检索枚举属性,而不是枚举本身。
This is my query : 这是我的查询:
final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class);
in MyClassDTO
I have 4 fields as following: 在MyClassDTO
我有4个字段如下:
private String icon;
private String provenance;
private int sizeX;
private int sizeY;
And the path I'm retrieving data from is : 我从中检索数据的路径是:
final Root<MyClass> from = query.from(MyClass.class);
MyClass
has 3 fields : MyClass
有3个字段:
@Column
@Enumerated(EnumType.STRING)
private EnumTileIcon enumTileIcon;
@Column
@Enumerated(EnumType.STRING)
private EnumProvenance enumProvenance;
@Column
@Enumerated(EnumType.STRING)
private EnumSize enumSize;
What I want to do is to populate the MyClassDTO
using the query.multiselect
, something like this : 我想要做的就是填充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())
);
How can I solve this ? 我怎么解决这个问题?
I am not sure about the role of multiselect. 我不确定multiselect的作用。 But when dealing with projections what this seems to be you can use CriteriaBuilder.construct()
但在处理预测时,您可以使用CriteriaBuilder.construct()
Create constructor to MyClassDTO
like (add params if needed) 创建MyClassDTO
构造函数(如果需要,添加params)
public MyClassDTO(EnumTileIcon icon, EnumProvenance provenance) {
this.icon=icon.toString();
this.provenance=provenance.toString();
}
Call the constructor in query like (add get params to match constructor params if needed) 在查询中调用构造函数(如果需要,添加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")));
Then you will be able to get 然后你就可以得到
TypedQuery<MyClassDTO> tq = em.createQuery(cq);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.