Правильный способ написания HQL в (…) запросе


80

Предполагая, что я хочу написать следующий HQL-запрос:

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

как правильно написать это как параметризованный запрос, например

FROM Cat c WHERE c.id IN (?)

Ответы:


130

Я не уверен, как это сделать с помощью позиционного параметра, но если вы можете использовать именованные параметры вместо позиционных, то именованный параметр можно поместить в скобки, а метод setParameterList из интерфейса Query можно использовать для привязки списка значений к этому параметру.

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

11

В более старых версиях Hibernate этот setParameterListметод может не быть включен Query. Вы все еще можете обратиться setParameter("ids", listOfIds);к старому для того же эффекта.


5
Почему это все равно изменили? Просто потратил час, выясняя, почему IllegalArgumentException in class: org.ase.mip.persistence.entities.BaseEntityImpl, getter method of property: id (BasicPropertyAccessor.java:186))происходит. Я звонил setParameterвместо setParameterList. DOH!
opncow

-4

Именованные параметры лучше, чем позиционные, мы должны быть осторожны при просмотре порядка / позиции - в то время как именованные - это просто.

По имени:

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

Позиционный:

Query query=em.createQuery("SELECT e FROM Employee e WHERE e.empId = ? and  e.empDepartment = ?");
query.setParameter(1, employeId);
query.setParameter(2, empDepartment);

3
Полностью согласен, но это не отвечает на мой вопрос о запросах IN (...)
Роберт Мунтяну
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.