当前位置: 首页 > 面试题库 >

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

艾国安
2023-03-14
问题内容

我正在使用JPA Criteria API,在多查询查询中,我想检索一个枚举属性,而不是枚举本身。

这是我的查询:

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

MyClassDTO我有4个领域如下:

private String icon;
private String provenance;
private int sizeX;
private int sizeY;

我从中检索数据的路径是:

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,是这样的:

query.multiselect(
    from.get(MyClass_.enumTileIcon.toString()),
    from.get(MyClass_.enumProvenance.name()),
    from.get(MyClass_.enumSize.getWidth()),
    from.get(MyClass_.enumSize.getHeight())
);

我该如何解决?


问题答案:

我不确定多选的作用。但是当处理 投影 时,您可以使用CriteriaBuilder.construct()

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

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

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

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);


 类似资料:
  • 这是我的疑问: 在中,我有以下4个字段: 我从中检索数据的路径是: 我该怎么解决这个?

  • 例如,我如何做类似的事情: 结果示例:

  • 问题内容: 我问这个问题有点傻,但是我找不到这个问题的简单答案。 以这个简单的实体为例: 它代表一个人,因此我想添加一个“ 性别 ”属性。 这将是“男性”或“女性”。所以呢? 我可以使用String,并要记住,“ m”代表男性,“ f”代表女性。 或者,我可以使用布尔值“ isMale”(是或否)。 但是,我认为无论哪种情况,Hibernate纯粹主义者都不会高兴:) 仔细搜索一下,我发现最佳实践

  • 我目前正在开发一个解析器。我走在一棵树上,大部分是决定论的(我能找到的数值有限)。 通常在这些情况下,我会创建一个枚举,其中包含我希望找到的值的名称,如下所示: 在这种情况下,我可以通过以下方式检查字符串是否属于枚举: 问题是目前我和特殊角色一起工作({" 我想要的是将枚举与那些特殊的字符元素相关联,例如 并继续使用以下简单明了的方法: 目前,我在任何地方都使用枚举,但对于这些元素,我使用表。我想

  • 我是MVC编程的新手。所以我用的是play框架。 获取未捕获的引用Error:未定义MODERATED