Java JPQL中带IN运算符的枚举列表

Java JPQL中带IN运算符的枚举列表,java,jpa-2.0,jpql,Java,Jpa 2.0,Jpql,哪个缺少以下JPQL查询 SELECT h FROM WorkFlowHistory h WHERE h.referenceNo = :referenceNo AND h.workflowTask IN ('CONFIRMATION','PAYMENT','ISSUING') 错误: invalid IN expression argument [CONFIRMATION] 动态查询方法 public List<WorkFlowHistory> findWorkFlowHist

哪个缺少以下
JPQL查询

SELECT h FROM WorkFlowHistory h WHERE h.referenceNo = :referenceNo 
AND h.workflowTask IN ('CONFIRMATION','PAYMENT','ISSUING')
错误:

invalid IN expression argument [CONFIRMATION]
动态查询方法

public List<WorkFlowHistory> findWorkFlowHistoryByRefNo(String refNo, WorkflowTask ...workflowTasks) {
    ...
    StringBuffer buffer = new StringBuffer("SELECT h FROM WorkFlowHistory h WHERE h.referenceNo = :referenceNo");
    if(workflowTasks != null && workflowTasks.length > 0) {
        buffer.append(" AND h.workflowTask IN (");
        for (int i = 0; i < workflowTasks.length; i++) {
            buffer.append("'" + workflowTasks[i] + "'");
            if ((i + 1) != workflowTasks.length) {
                buffer.append(",");
            }
        }
        buffer.append(")");
    }
    Query q = em.createQuery(buffer.toString());
    ....
}

我认为问题在于用DB表示枚举。您的枚举如何映射到数据库
Ordinal
String

最好将枚举作为参数占位符放在JPQL查询中:

SELECT h FROM WorkFlowHistory h WHERE h.referenceNo = :referenceNo 
AND h.workflowTask IN :workflowTasks
然后将其作为参数添加到查询中,如下所示:

...
List<WorkflowTask> workflowTasks=Arrays.asList({WorkflowTask.CONFIRMATION, WorkflowTask.PAYMENT WorkflowTask.ISSUING });
...
Query q = em.createQuery(buffer.toString());
q.addParameter("workflowTasks", workflowTasks);
。。。
List workflowTasks=Arrays.asList({WorkflowTask.CONFIRMATION,WorkflowTask.PAYMENT WorkflowTask.issueng});
...
Query q=em.createQuery(buffer.toString());
q、 addParameter(“workflowTasks”,workflowTasks);
这样,您就不必考虑如何在DB中表示枚举。

Thz,我也在这里了解到:感谢您的支持
...
List<WorkflowTask> workflowTasks=Arrays.asList({WorkflowTask.CONFIRMATION, WorkflowTask.PAYMENT WorkflowTask.ISSUING });
...
Query q = em.createQuery(buffer.toString());
q.addParameter("workflowTasks", workflowTasks);