哪个缺少以下 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;
}
}
最佳答案
我认为问题在于数据库中枚举的表示。您的枚举如何映射到数据库 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);
这样你就不必考虑你的枚举在数据库中如何表示。
关于java - JPQL 中带有 IN 运算符的枚举列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17231225/