Richtige Methode zum Schreiben einer HQL in (…) Abfrage


80

Angenommen, ich möchte die folgende HQL-Abfrage schreiben:

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

Was ist die richtige Art, dies als parametrisierte Abfrage zu schreiben, z

FROM Cat c WHERE c.id IN (?)

Antworten:


130

Ich bin mir nicht sicher, wie ich das mit Positionsparametern machen soll, aber wenn Sie benannte Parameter anstelle von positionellen Parametern verwenden können, können benannte Parameter in Klammern gesetzt werden und die setParameterList- Methode von der Abfrageoberfläche kann verwendet werden, um die Liste der Werte an diesen Parameter zu binden.

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

11

In älteren Versionen von Hibernate ist die setParameterListMethode möglicherweise nicht aktiviert Query. Sie können immer noch setParameter("ids", listOfIds);den älteren für den gleichen Effekt aufrufen .


5
Warum wurde das überhaupt geändert? Ich habe gerade eine Stunde damit verbracht herauszufinden, warum IllegalArgumentException in class: org.ase.mip.persistence.entities.BaseEntityImpl, getter method of property: id (BasicPropertyAccessor.java:186))es passiert ist. Ich rief setParameterstatt setParameterList. DOH!
Opncow

-4

Benannte Parameter sind besser als Positionsparameter. Wir sollten bei der Betrachtung der Reihenfolge / Position vorsichtig sein - während benannte Parameter einfach sind.

Genannt:

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

Position:

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

3
Stimme voll und ganz zu, aber das beantwortet meine Frage zu IN (...) Anfragen nicht
Robert Munteanu
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.