如何在具有枚举字段的实体上使用JPA CriteriaQuery填充DTO类字符串字段?
我正在使用JPA Criteria API,在我的查询多选中我想要检索枚举属性,而不是枚举本身。
这是我的查询:
final CriteriaQuery query = builder.createQuery(MyClassDTO.class);
在MyClassDTO
我有4个字段如下:
private String icon; private String provenance; private int sizeX; private int sizeY;
我从中检索数据的路径是:
final Root 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
填充query.multiselect
,如下所示:
query.multiselect( from.get(MyClass_.enumTileIcon.toString()), from.get(MyClass_.enumProvenance.name()), from.get(MyClass_.enumSize.getWidth()), from.get(MyClass_.enumSize.getHeight()) );
我怎么解决这个问题?
我不确定multiselect的作用。 但是在处理预测时,您可以使用CriteriaBuilder.construct()
创建MyClassDTO
构造函数(如果需要,添加params)
public MyClassDTO(EnumTileIcon icon, EnumProvenance provenance) { this.icon=icon.toString(); this.provenance=provenance.toString(); }
在查询中调用构造函数(如果需要,添加get params以匹配构造函数参数)
CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(MyClassDTO.class); Root root = cq.from(MyClass.class); cq.select(cb.construct(MyClassDTO.class, root.get("enumTileIcon"), root.get("enumProvenance")));
然后你就可以得到
TypedQuery tq = em.createQuery(cq);