java - JPQL 中带有 IN 运算符的枚举列表

标签 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> 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());
    ....
}

我的枚举类

public enum WorkflowTask {
    UNDERWRITING("Underwriting"),
    SURVEY("Survey"),
    APPROVAL("Approval"),
    INFORM("Inform"),
    CONFIRMATION("Confirmation"),
    PAYMENT("Payment"),
    PROPOSAL_REJECT("Proposal Reject"),
    ISSUING("Issuing");

    private String label;

    private WorkflowTask(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }
}   

最佳答案

我认为问题在于数据库中枚举的表示。您的枚举如何映射到数据库 OrdinalString 中?

最好的方法是将枚举作为 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);

这样你就不必考虑你的枚举在数据库中如何表示。

关于java - JPQL 中带有 IN 运算符的枚举列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17231225/

相关文章:

java - 如何序列化 myCount 变量?

google-app-engine - AppEngine + DataNucleus + JPA 2 的工作 Maven3 配置

hibernate - 如何在 Scala 实体上运行 Hibernate 的 JPAMetaModelEntityProcessor 静态元模型生成器

java - 无法对 JPQL 中的列进行 ORDER BY

java - 有没有办法获取带有结果集的 JPA 命名查询的计数大小?

java - 编写一个通用的 httpservletresponswrapper 来处理大型 Web 应用程序中响应内容类型的所有特殊情况的最佳方法是什么?

java - 一个 FXML 文件的多个 Controller

Java 版本在 Linux 上没有变化

java - 使用 JPA 和 Hibernate 保存 OneToMany 关系的命令

java - 我应该更喜欢使用 JPA - 纯 SQL 还是 JPQL 以及如何使用 JPQL 和实体创建/删除表