次のパラメーター化された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スタイルのパラメーターでは機能しません。
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);
hQLでは、クエリパラメーターを使用し、setParameterListメソッドでコレクションを設定できます。
Query q = session.createQuery("SELECT entity FROM Entity entity WHERE name IN (:names)");
q.setParameterList("names", names);
括弧を省略して、単に「setParameter」を呼び出すだけで、少なくともHibernateで機能するようになりました。
String jpql = "from A where name in :names";
Query q = em.createQuery(jpql);
q.setParameter("names", l);
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;
}
}
query.setParameterList( "name"、new String [] {"Ron"、 "Som"、 "Roxi"});私の問題を修正しました