Java 使用枚举值的查询中的jpql

Java 使用枚举值的查询中的jpql,java,enums,jpql,Java,Enums,Jpql,我使用JPQL查询检查列表是否包含指定的枚举值。如果枚举值是要检查的单个元素,那么它非常简单 在查询表达式中 query = "... where s.status = :status"; 然后将参数设置为 query.setParameter("status", statusValue); 但我想检查以下内容 query = "... where s.status IN (:statusList)"; 其中,statusList是一组数字(例如,“0,1,2”表示状态值列表) 但我找不到

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

在查询表达式中

query = "... where s.status = :status";
然后将参数设置为

query.setParameter("status", statusValue);
但我想检查以下内容

query = "... where s.status IN (:statusList)";
其中,
statusList
是一组数字(例如,“0,1,2”表示状态值列表)

但我找不到解决办法。我还检查了查询中(statusList)中的
s.status.ordinal(),但没有运气

我正在使用JPA实现:EclipseLink(JPA2.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));

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

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

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

您是否保留序号值而不是字符串?@KevinBowersox:是的,在数据库中,我存储了序号值,在前端,Enum表示该值。我建议将枚举的实际字符串存储在数据库中。如果您的枚举发生更改,您可能需要在数据库中执行一些数据调整。@KevinBowersox:非常抱歉,我现在无法更改数据库。该系统数据量大,实时性好。所以,我需要一些其他的解决方案。ThanksI收到以下错误:“您试图为参数statusList设置一个类型为class java.util.RegularEnumSet的值,该值的类型应为来自查询的SType类…”。我现在能做什么?您确定没有用
=
替换
中的
?如果没有,请编辑问题并告诉我们您正在使用哪个JPA实现,向我们显示实体的代码和您用于执行查询的代码,以及异常的完整堆栈跟踪。抱歉,我的查询中有一个错误。我现在修复了它:statusList参数周围不需要括号。