web-dev-qa-db-ja.com

HQLまたはJava永続クエリ言語のIN句

次のパラメーター化された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スタイルのパラメーターでは機能しません。

74
Daniel

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);
148
jpkrohling

hQLでは、クエリパラメーターを使用し、setParameterListメソッドでコレクションを設定できます。

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

括弧を省略して、単に「setParameter」を呼び出すだけで、少なくともHibernateで機能するようになりました。

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

Hibernate 5.0.2.Finalで純粋なJPAを実際のプロバイダーとして使用すると、以下は位置パラメーターでも動作するようです。

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;
    }
}
3
Attila T

query.setParameterList( "name"、new String [] {"Ron"、 "Som"、 "Roxi"});私の問題を修正しました