【问题标题】:Enumeration List with IN operator in JPQLJPQL 中带有 IN 运算符的枚举列表
【发布时间】:2023-03-31 18:04:01
【问题描述】:

以下JPQL query缺少哪个?

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;
    }
}   

【问题讨论】:

    标签: java jpa-2.0 jpql


    【解决方案1】:

    我认为问题在于您的枚举在 DB 中的表示。您的枚举是如何映射到数据库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);
    

    这样您就不必考虑您的枚举在 DB 中是如何表示的。

    【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多