2013-06-02 68 views
7

我正在使用JPQL查詢來檢查列表是否包含指定的枚舉值。如果枚舉值是一個單獨的元素來檢查,那麼它非常簡單。帶有枚舉值的jpql IN查詢

在查詢表達式,

query = "... where s.status = :status"; 

,然後設置參數一樣

query.setParameter("status", statusValue); 

但我要檢查類似下面

query = "... where s.status IN (:statusList)"; 

其中statusList是一串數字(例如「0,1,2」表示l ist的狀態值)

但我找不到解決方案。我也查詢了s.status.ordinal() IN (statusList)查詢但沒有運氣。

我使用JPA實施:的EclipseLink(JPA 2.0)

我的實體的實際名稱是SType

public enum SType 
{ 
    REQUISITION, 
    PURCHASE, 
    FINISHED, 
    // others 
    RETURN; 
} 

QUERY:

String querySt = "select s.slipType.slipNameSt,s.slipNumberSt, s.idNr from Slip s 
where s.slipType.sType IN (:enumTypeListt)"; 

em.createQuery(querySt).setParameter("enumTypeList", EnumSet.of(SType.REQUISITION, 
                   SType.PURCHASE)); 
+0

您是否堅持序號值而不是字符串? –

+0

@KevinBowersox:是的,在數據​​庫中,我存儲了序數值,並在前端,Enum表示該值。 – sarwar026

+0

我會建議在數據庫中存儲枚舉的實際字符串。如果你的枚舉改變了,你可能需要在你的數據庫中進行一些數據調整。 –

回答

12

你不能比較枚舉與字符串或整數。持久字段的類型是Status,它是一個枚舉(或者至少假設類型是Status,因爲您沒有指定枚舉類的名稱)。

因此,您必須作爲參數傳遞給IN子句中的集合是Status的集合。例如:

query = "... where s.status IN :statusList"; 
... 
q.setParameter("statusList", EnumSet.of(Status.APPROVED, Status.CLOSED)); 
+0

我得到了以下錯誤:「您試圖設置參數statusList的類java.util.RegularEnumSet類型的值與預期類型的​​查詢類SType類型」。我現在能做什麼? – sarwar026

+0

你確定你沒有用'='替換'IN'嗎?如果沒有,請編輯問題並告訴我們您正在使用的是哪個JPA實現,向我們展示實體的代碼和您用於執行查詢的代碼,以及異常的完整堆棧跟蹤。 –

+0

對不起,我的查詢中有一個錯誤。我現在修復了它:不需要使用括號來產生statusList參數。 –