2013-06-02 10 views
7

Używam zapytania JPQL do sprawdzenia, czy lista zawiera określone wartości wyliczeniowe. Jeśli wartość wyliczeniowa jest pojedynczym elementem do sprawdzenia, jest to bardzo proste.jpql W zapytaniu z wartością wyliczeniową

W wyrażeniu kwerendy,

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

a następnie ustawić parametr jak

query.setParameter("status", statusValue); 

Ale chcę coś sprawdzić jak poniżej

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

gdzie statusList jest ciągiem liczby (np. "0,1,2", co oznacza, że ​​l ist wartości wartości)

Ale nie mogę znaleźć rozwiązania. Sprawdziłem również w zapytaniu s.status.ordinal() IN (statusList), ale bez powodzenia.

Używam WZP realizacji: EclipseLink (JPA 2.0) rzeczywista nazwa

podmiot, jest SType

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

zapytanie:

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

Twoje zachowanie wartości porządkowej w przeciwieństwie do ciągu? –

+0

@KevinBowersox: Tak, w bazie danych zapisałem wartości porządkowe, aw interfejsie użytkownika, Enum reprezentuje tę wartość. – sarwar026

+0

Zaleciłbym przechowywanie rzeczywistego ciągu wyliczeniowego w bazie danych. Jeśli Twoje wyliczenie kiedykolwiek się zmieni, być może będziesz musiał przeprowadzić korektę danych w swojej bazie danych. –

Odpowiedz

12

Nie można porównywać teksty stałe z ciągami lub liczbami całkowitymi. Pole trwałe jest typu Status, który jest wyliczeniem (a przynajmniej załóżmy, że typem jest Status, ponieważ nie podano nazwy klasy wyliczeniowej).

To, co musisz przekazać jako argument do kolekcji w klauzuli IN, to zbiór statusu. Na przykład:

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

Mam następujący błąd: "Podjęto próbę ustawienia wartości klasy type java.util.RegularEnumSet dla parametru statusList z oczekiwanym typem klasy SType z zapytania ...". co mogę teraz zrobić? – sarwar026

+0

Czy jesteś pewien, że nie zastąpiłeś 'IN' przez' = '? Jeśli nie, edytuj pytanie i powiedz nam, której implementacji JPA używasz, pokaż nam kod encji i kod, którego używasz do wykonania kwerendy, a także kompletny ślad stosu wyjątku. –

+0

Niestety, miałem błąd w moim zapytaniu. Naprawiłem to teraz: nie ma potrzeby używania nawiasów wokół parametru statusList. –