Правильний спосіб написання 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.