jpql IN 查询与枚举值

2022-09-03 06:15:17

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

在查询表达式中,

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

然后设置参数,如

query.setParameter("status", statusValue);

但我想检查下面这样的东西

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

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

但我找不到解决方案。我也在查询中检查过,但没有运气。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));

答案 1

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

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

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

答案 2