Zbudowałem NamedQuery, które wygląda następująco:
@NamedQuery(name = "EventLog.viewDatesInclude",
query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
+ "el.timeMark <= :dateTo AND "
+ "el.name IN (:inclList)")
To, co chcę zrobić, to wypełnić parametr: includeList listą pozycji zamiast jednej pozycji. Na przykład, jeśli mam, new List<String>() { "a", "b", "c" }
jak mogę to uzyskać w parametrze: inclList? Pozwala mi tylko skodyfikować jeden ciąg. Na przykład:
setParameter("inclList", "a") // works
setParameter("inclList", "a, b") // does not work
setParameter("inclList", "'a', 'b'") // does not work
setParameter("inclList", list) // throws an exception
Wiem, że mógłbym po prostu zbudować ciąg znaków i na jego podstawie zbudować całe zapytanie, ale chciałem uniknąć narzutu. Czy jest lepszy sposób na zrobienie tego?
Powiązane pytanie: jeśli lista jest bardzo duża, czy istnieje dobry sposób na zbudowanie takiego zapytania?
Odpowiedzi:
W przypadku używania
IN
z parametrem o wartości kolekcji nie potrzebujesz(...)
:źródło
Właściwy format zapytania JPA to:
Jeśli jako dostawca używasz starszej wersji Hibernate, musisz napisać:
ale to jest błąd ( HHH-5126 ) (EDYCJA: który został już rozwiązany).
źródło
Działa dla mnie z JPA 2, Jboss 7.0.2
źródło
Musisz przekonwertować na,
List
jak pokazano poniżej:źródło