0

次のどれが欠けています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;
    }
}   
4

1 に答える 1

2

問題は、DB での Enum の表現にあると思います。列挙型はデータベースでどのようにマッピングされています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);

このようにして、Enum が DB でどのように表現されるかを考える必要はありません。

于 2013-06-21T09:13:41.217 に答える