Właściwy sposób pisania HQL w zapytaniu (…)

80

Zakładając, że chcę napisać następującą kwerendę HQL:

FROM Cat c WHERE c.id IN (1,2,3)

jaki jest właściwy sposób zapisania tego jako sparametryzowanego zapytania, np

FROM Cat c WHERE c.id IN (?)
Robert Munteanu
źródło

Odpowiedzi:

130

Nie jestem pewien, jak to zrobić z parametrem pozycyjnym, ale jeśli zamiast pozycyjnych można użyć nazwanych parametrów, to nazwany parametr można umieścić w nawiasach kwadratowych, a do powiązania listy wartości z tym parametrem można użyć metody setParameterList z interfejsu Query .

...
Query query = session.createQuery("FROM Cat c WHERE c.id IN (:ids)");
query.setParameterList("ids", listOfIds);
...
Matej
źródło
11

Starsze wersje Hibernate mogą nie mieć setParameterListwłączonej metody Query. Nadal możesz zadzwonić setParameter("ids", listOfIds);do starszego, aby uzyskać ten sam efekt.

Travis
źródło
5
Dlaczego i tak zostało to zmienione? Właśnie spędziłem godzinę, zastanawiając się, dlaczego IllegalArgumentException in class: org.ase.mip.persistence.entities.BaseEntityImpl, getter method of property: id (BasicPropertyAccessor.java:186))tak się dzieje. Zadzwoniłem setParameterzamiast setParameterList. DOH!
opncow
-4

Nazwane parametry są lepsze niż parametry pozycyjne, powinniśmy uważać na kolejność / pozycję - choć nazwane jest łatwe.

O imieniu:

Query query = session.createQuery("select count(*) from User"+" where userName=:userName and passWord=:passWord");
        query.setString("userName", userName);
        query.setString("passWord", passWord);

Pozycyjny:

Query query=em.createQuery("SELECT e FROM Employee e WHERE e.empId = ? and  e.empDepartment = ?");
query.setParameter(1, employeId);
query.setParameter(2, empDepartment);
Mittinti Ramana Murthy
źródło
3
W pełni się zgadzam, ale to nie odpowiada na moje pytanie dotyczące zapytań IN (...)
Robert Munteanu