Forma correcta de escribir un HQL en (…) consulta

80

Suponiendo que quiero escribir la siguiente consulta HQL:

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

¿Cuál es la forma correcta de escribir esto como una consulta parametrizada?

FROM Cat c WHERE c.id IN (?)
Robert Munteanu
fuente

Respuestas:

130

No estoy seguro de cómo hacer esto con el parámetro posicional, pero si puede usar parámetros con nombre en lugar de posicional, entonces el parámetro con nombre se puede colocar entre corchetes y el método setParameterList de la interfaz de consulta se puede usar para vincular la lista de valores a este parámetro.

...
Query query = session.createQuery("FROM Cat c WHERE c.id IN (:ids)");
query.setParameterList("ids", listOfIds);
...
Matej
fuente
11

Es posible que las versiones anteriores de Hibernate no tengan el setParameterListmétodo activado Query. Aún puede recurrir setParameter("ids", listOfIds);al anterior para obtener el mismo efecto.

Travis
fuente
5
¿Por qué se ha cambiado esto de todos modos? Pasé una hora averiguando por qué IllegalArgumentException in class: org.ase.mip.persistence.entities.BaseEntityImpl, getter method of property: id (BasicPropertyAccessor.java:186))estaba pasando. Llamé en setParameterlugar de setParameterList. DOH!
Opncow
-4

Los parámetros nombrados son mejores que los parámetros posicionales, debemos tener cuidado al mirar el orden / posición, mientras que nombrar es fácil.

Llamado:

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

Posicional:

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
fuente
3
Totalmente de acuerdo, pero eso no responde a mi pregunta sobre las consultas IN (...)
Robert Munteanu