简体   繁体   English

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

[英]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.

相关问题 JPA实体中的枚举类型字段 - Enum type fields in JPA Entity 如何在具有枚举值的JPA ElementCollection映射中查询键,并使用CriteriaQuery? - How to query for the key in a JPA ElementCollection map having an enum as value and using CriteriaQuery? DTO Query with JPA CriteriaQuery 和 Hibernate 使用实体作为 DTO 构造函数创建许多选择 - DTO Query with JPA CriteriaQuery and Hibernate using entity as a DTO constructor creates many selects 在JPA CriteriaQuery中使用@Embeddable实体 - Using an @Embeddable entity in a JPA CriteriaQuery 如何使用反射通过实体查找 dto 中的所有“缺失”和“额外”字段? - How to find all 'missing' and 'extra' fields in dto by their entity using Reflection? JPA CriteriaQuery:未映射对象的字段 - JPA CriteriaQuery: fields of the object doesn't mapped JPA-如何使用来自实体继承的criteriaBuilder.construct填充DTO - JPA - How to populate a DTO using criteriaBuilder.construct from an Entity Inheritance 强制将字段包含在JPA @Entity类中 - Enforcing inclusion of fields in JPA @Entity class JPA 可嵌入 class 的 AttributeOverride 与实体类型字段 - JPA AttributeOverride for Embeddable class with Entity type fields JPA 实体类使用 2 个@GeneratedValue 字段给出错误 - JPA Entity class giving error with 2 @GeneratedValue fields
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM