Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在具有枚举字段的实体上使用JPA CriteriaQuery填充DTO类字符串字段?_Java_Jpa_Enums_Dao_Criteria Api - Fatal编程技术网

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

Java 如何在具有枚举字段的实体上使用JPA CriteriaQuery填充DTO类字符串字段?,java,jpa,enums,dao,criteria-api,Java,Jpa,Enums,Dao,Criteria Api,我使用的是JPA Criteria API,在我的查询multiselect中,我希望检索一个枚举属性,而不是枚举本身 这是我的疑问: final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class); 我从中检索数据的路径是: final Root<MyClass> from = query.from(MyClass.class); 我要做的是使用查询填充MyClassDTO。

我使用的是JPA Criteria API,在我的查询multiselect中,我希望检索一个枚举属性,而不是枚举本身

这是我的疑问:

final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class);
我从中检索数据的路径是:

final Root<MyClass> from = query.from(MyClass.class);
我要做的是使用
查询填充
MyClassDTO
。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
like(如果需要,添加参数)

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

CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(MyClassDTO.class);
Root=cq.from(MyClass.class);
cq.select(cb.construct)(MyClassDTO.class,
root.get(“enumTileIcon”)、root.get(“枚举起源”);
然后你就可以得到

TypedQuery<MyClassDTO> tq = em.createQuery(cq);
TypedQuery tq=em.createQuery(cq);

我想你必须使用元组查询来完成这个任务。@Antoniossss我该怎么做呢?builder.createQuery(tuple.class);
query.multiselect(
    from.get(MyClass_.enumTileIcon.toString()),
    from.get(MyClass_.enumProvenance.name()),
    from.get(MyClass_.enumSize.getWidth()),
    from.get(MyClass_.enumSize.getHeight())
);
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);