如何在具有枚举字段的实体上使用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);