带有枚举值的 jpql IN 查询

Posted

技术标签:

【中文标题】带有枚举值的 jpql IN 查询【英文标题】:jpql IN query with enum value 【发布时间】:2013-05-28 16:24:38 【问题描述】:

我正在使用 JPQL 查询来检查列表是否包含指定的枚举值。如果枚举值是要检查的单个元素,那么它非常简单。

在查询表达式中,

query = "... where s.status = :status";

然后像这样设置参数

query.setParameter("status", statusValue);

但我想检查以下内容

query = "... where s.status IN (:statusList)";

其中statusList 是一串数字(例如“0,1,2”表示状态值的列表)

但我找不到解决方案。我还在查询中检查了s.status.ordinal() IN (statusList),但没有运气。

我正在使用 JPA 实现:EclipseLink (JPA 2.0)

我的实体的实际名称是SType

public enum SType

    REQUISITION,
    PURCHASE,   
    FINISHED,   
    // others
    RETURN;

查询:

String querySt = "select s.slipType.slipNameSt,s.slipNumberSt, s.idNr from Slip s 
where s.slipType.sType IN (:enumTypeListt)";

em.createQuery(querySt).setParameter("enumTypeList", EnumSet.of(SType.REQUISITION, 
                                                                SType.PURCHASE));

【问题讨论】:

您坚持序数值而不是字符串? @KevinBowersox:是的,在数据​​库中,我存储了序数值,在前端,Enum 表示该值。 我建议将枚举的实际字符串存储在数据库中。如果您的枚举发生变化,您可能需要在数据库中执行一些数据调整。 @KevinBowersox:我很抱歉此时我无法更改数据库。该系统有大量的数据和实时。所以,我需要一些其他的解决方案。谢谢 【参考方案1】:

您不能将枚举与字符串或整数进行比较。持久字段的类型是 Status,它是一个枚举(或者至少,假设类型是 Status,因为您没有指定枚举类的名称)。

因此,您必须在IN 子句中作为集合参数传递的是状态集合。例如:

query = "... where s.status IN :statusList";
...
q.setParameter("statusList", EnumSet.of(Status.APPROVED, Status.CLOSED));

【讨论】:

我收到以下错误:“您已尝试为参数 statusList 设置类型为 java.util.RegularEnumSet 的值,预期类型为查询中的类 SType ...”。我现在能做什么? 您确定没有将IN 替换为= 吗?如果不是,请编辑问题并告诉我们您正在使用哪个 JPA 实现,向我们展示实体的代码和您用于执行查询的代码,以及异常的完整堆栈跟踪。跨度> 抱歉,我的查询中有错误。我现在修好了:statusList 参数周围不需要括号。

以上是关于带有枚举值的 jpql IN 查询的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL 查询转换为 JPQL 查询 - 总和具有特定文本值的属性数

JPQL查询where子句使用IN,如何将参数传递给查询

JPQL JOIN 查询对应值的行数(多列)

在 JPQL 中转换 NOT IN SELECT 查询

用于从 OneToMany 关系中获取不同值的 MySQL 或 JPQL 查询(条件优先级)

带有 CURRENT_DATE - 1 的 JPQL 查询不起作用