2013-06-02 7 views
7

Ich verwende JPQL-Abfrage, um zu überprüfen, ob die Liste die angegebenen Enum-Werte enthält. Wenn der Enum-Wert ein einzelnes zu überprüfendes Element ist, ist es ziemlich einfach.jpql IN-Abfrage mit Aufzählungswert

In Abfrageausdruck

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

und dann den Parameter wie

query.setParameter("status", statusValue); 

Aber ich möchte so etwas wie unten

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

prüfen, wo statusList ist eine Kette von Zahlen (zB "0,1,2", was bedeutet, dass l ist der Werte des Status)

Aber ich kann keine Lösung finden. Ich habe auch mit s.status.ordinal() IN (statusList) in Query aber kein Glück überprüft.

Ich bin mit JPA-Implementierung: Eclipse (JPA 2.0)

Meine Entity tatsächliche Name ist 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

Sie bestehen den Ordinalwert im Gegensatz zu der Zeichenfolge? –

+0

@KevinBowersox: Ja, in der Datenbank habe ich die Ordinalwerte gespeichert und im Frontend stellt Enum diesen Wert dar. – sarwar026

+0

Ich würde empfehlen, den tatsächlichen String des Enums in der Datenbank zu speichern. Wenn sich Ihr Enum ändert, müssen Sie möglicherweise eine Datenanpassung in Ihrer Datenbank vornehmen. –

Antwort

12

Sie können nicht Aufzählungen vergleichen mit Strings oder ganzen Zahlen. Das persistente Feld hat den Typ Status, was eine Enumeration ist (oder nehmen wir an, dass der Typ "Status" ist, da Sie den Namen der Enum-Klasse nicht angegeben haben).

Also, was Sie als Argument für die Sammlung in der IN Klausel übergeben müssen, ist eine Sammlung von Status. Zum Beispiel:

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

Ich habe den folgenden Fehler erhalten: "Sie haben versucht, einen Wert des Typs class java.util.RegularEnumSet für den Parameter statusList mit dem erwarteten Typ der Klasse SType from query ..." festzulegen. Was kann ich jetzt machen? – sarwar026

+0

Sind Sie sicher, dass Sie 'IN' nicht durch' = 'ersetzt haben? Wenn nicht, bearbeiten Sie die Frage und teilen Sie uns mit, welche JPA-Implementierung Sie verwenden. Zeigen Sie uns den Code der Entität und den Code, den Sie zum Ausführen der Abfrage verwenden, sowie den vollständigen Stack-Trace der Ausnahme. –

+0

Entschuldigung, ich hatte einen Fehler in meiner Anfrage. Ich habe es jetzt behoben: Keine Notwendigkeit für Klammern um den Parameter statusList. –