如何在具有枚举字段的实体上使用JPA CriteriaQuery填充DTO类字符串字段? [英] How to populate DTO class string fields using JPA CriteriaQuery on Entity having enum fields?

查看:515
本文介绍了如何在具有枚举字段的实体上使用JPA CriteriaQuery填充DTO类字符串字段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用JPA Criteria API,在我的查询multiselect中我想要检索枚举属性,而不是enum本身。

I'm using JPA Criteria API, and in my query multiselect I want to retrieve an enum attribute, and not the enum itself.

这是我的查询:

final CriteriaQuery<MyClassDTO> query = builder.createQuery(MyClassDTO.class);

in MyClassDTO 我有4个字段如下:

in MyClassDTO I have 4 fields as following:

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 有3个字段:

@Column
@Enumerated(EnumType.STRING)
private EnumTileIcon enumTileIcon;

@Column
@Enumerated(EnumType.STRING)
private EnumProvenance enumProvenance;

@Column
@Enumerated(EnumType.STRING)
private EnumSize enumSize;

我想要做的是填充 MyClassDTO 使用 query.multiselect ,如下所示:

What I want to do is to populate the MyClassDTO using the query.multiselect, something like this :

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 ?

推荐答案

我不确定multiselect的作用。但在处理预测时,您可以使用 CriteriaBuilder.construct()

I am not sure about the role of multiselect. But when dealing with projections what this seems to be you can use CriteriaBuilder.construct()

创建 MyClassDTO 之类的构造函数(如果需要,添加参数)

Create constructor to MyClassDTO like (add params if needed)

public MyClassDTO(EnumTileIcon icon, EnumProvenance provenance) {
    this.icon=icon.toString();
    this.provenance=provenance.toString();
}

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

Call the constructor in query like (add get params to match constructor params if needed)

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 CriteriaQuery填充DTO类字符串字段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆