2013-06-02 23 views
7

Sto utilizzando la query JPQL per verificare se l'elenco contiene i valori enum specificati. Se il valore enum è un singolo elemento da verificare, allora è piuttosto semplice.jpql IN query con valore enum

In espressione di query,

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

e quindi impostare parametri come

query.setParameter("status", statusValue); 

ma voglio controllare qualcosa come qui di seguito

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

dove statusList è una stringa di numeri (ad es. "0,1,2" che significa la l ist dei valori di stato)

Ma non riesco a trovare una soluzione. Ho anche controllato con s.status.ordinal() IN (statusList) nella query ma senza fortuna.

sto usando JPA Implementazione: EclipseLink (JPA 2.0) nome effettivo

mio dell'Ente è SType

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

DOMANDA:

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

Il tuo valore ordinale in contrapposizione alla stringa? –

+0

@KevinBowersox: Sì, nel database, ho memorizzato i valori ordinali e nel front-end, Enum rappresenta quel valore. – sarwar026

+0

Si consiglia di memorizzare la stringa effettiva dell'enumerazione nel database. Se il tuo enum dovesse cambiare, potrebbe essere necessario eseguire alcune modifiche ai dati nel tuo database. –

risposta

12

Non è possibile confrontare le enumerazioni con stringhe o interi. Il campo persistente è di tipo Status, che è un enum (o almeno, supponiamo che il tipo sia Status, dal momento che non hai specificato il nome della classe enum).

Quindi, ciò che è necessario passare come argomento per la raccolta nella clausola IN è un insieme di stato. Ad esempio:

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

ho ricevuto il seguente errore: "Si è tentato di impostare un valore di tipo classe java.util.RegularEnumSet per il parametro statusList con tipo previsto di classe SType da query ...". cosa posso fare ora? – sarwar026

+0

Sei sicuro di non aver sostituito 'IN' di' = '? In caso contrario, modifica la domanda e indicaci quale implementazione JPA stai utilizzando, mostraci il codice dell'entità e il codice che stai utilizzando per eseguire la query, nonché la traccia di stack completa dell'eccezione. –

+0

Siamo spiacenti, ho avuto un bug nella mia domanda. L'ho risolto ora: non c'è bisogno di parentesi per il parametro statusList. –