Речення IN у мові запитів HQL або Java Persistence Query


78

У мене є такий параметризований запит JPA або Hibernate:

SELECT entity FROM Entity entity WHERE name IN (?)

Я хочу передати параметр як ArrayList <String>, чи можливо це? Зимовий режим говорить мені, що

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.String

Чи можливо це взагалі?

ВІДПОВІДЬ : Колекції як параметри працюють лише з іменованими параметрами типу " :name", а не з параметрами стилю JDBC, як " ?".


2
Не могли б ви додати свою відповідь на це запитання? Я знаю, що це старе, але відповіді на ваше запитання не лише дозволено, це явно заохочується.
Макото

Відповіді:


157

Ви використовуєте Queryоб'єкт Hibernate або JPA? Для JPA це має працювати нормально:

String jpql = "from A where name in (:names)";
Query q = em.createQuery(jpql);
q.setParameter("names", l);

Для режиму глибокого сну вам потрібно буде використовувати setParameterList:

String hql = "from A where name in (:names)";
Query q = s.createQuery(hql);
q.setParameterList("names", l);

Гаразд, проблема була в використанні? для позначення параметрів. З названими параметрами, такими як: peter, це працює.
Даніель

отже, вам не потрібні лапки для кожного рядка у списку?
CCC

Як встановити масив String [] як параметр запиту
priyadarshini

1
Ви можете перетворити його на список:List<String> list = Arrays.asList(yourArray);
MarkyDD

1
IMP: Для старих версій сплячого режиму потрібні дужки. Новіші версії не підтримуватимуть () - принаймні в моєму випадку. Крім того , побачити це рішення stackoverflow.com/a/21341663/6043669
HopeKing

24

в HQL ви можете використовувати параметр запиту та встановити Collection за допомогою методу setParameterList.

    Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
    q.setParameterList("names", names);

5

Залишити дужки і просто викликати 'setParameter' тепер працює принаймні з Hibernate.

String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);

3

Використовуючи чистий JPA з Hibernate 5.0.2.Final як фактичного постачальника, здається, також працює з позиційними параметрами:

Entity.java:

@Entity
@NamedQueries({
    @NamedQuery(name = "byAttributes", query = "select e from Entity e where e.attribute in (?1)") })
public class Entity {
    @Column(name = "attribute")
    private String attribute;
}

Dao.java:

public class Dao {
    public List<Entity> findByAttributes(Set<String> attributes) {
        Query query = em.createNamedQuery("byAttributes");
        query.setParameter(1, attributes);

        List<Entity> entities = query.getResultList();
        return entities;
    }
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.