IN-предложение в языке запросов HQL или Java Persistence Query

У меня есть следующий параметризованный 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

Возможно ли это вообще?

ANSWER. Коллекции как параметры работают только с именованными параметрами типа ":name", а не с такими параметрами стиля JDBC, как "?".

Ответ 1

Используете ли вы объект Hibernate Query или JPA? Для JPA он должен работать нормально:

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

Для Hibernate вам нужно использовать setParameterList:

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

Ответ 2

в HQL вы можете использовать параметр запроса и установить Collection с помощью метода setParameterList.

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

Ответ 3

Оставляя скобки и просто вызывая "setParameter", теперь работает, по крайней мере, с гибернацией.

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

Ответ 4

Использование чистой 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;
    }
}

Ответ 5

query.setParameterList("name", new String [] {"Ron", "Som", "Roxi"}); исправил мою проблему