web-dev-qa-db-ja.com

JPQL IN句:Java-Arrays(or Lists、Sets ...)?

データベースから、小さいが任意の数の値のいずれかに設定されたテキストタグを持つすべてのオブジェクトをロードしたいと思います。 SQLでこれを実行する論理的な方法は、「IN」句を作成することです。 JPQLはINを許可しますが、すべてのパラメーターを直接INに指定する必要があります(たとえば、「in(:in1、:in2、:in3)」)。

IN句の値に展開する必要がある配列、またはリスト(またはその他のコンテナ)を指定する方法はありますか?

99
Bernd Haug

JPA 1.0についてはわかりませんが、JPA 2.0ではCollectionを渡すことができます。

String qlString = "select item from Item item where item.name IN :names"; 
Query q = em.createQuery(qlString, Item.class);

List<String> names = Arrays.asList("foo", "bar");

q.setParameter("names", names);
List<Item> actual = q.getResultList();

assertNotNull(actual);
assertEquals(2, actual.size());

EclipseLInkでテスト済み。 Hibernate 3.5.1では、パラメーターを括弧で囲む必要があります。

String qlString = "select item from Item item where item.name IN (:names)";

ただし、これはバグです。前のサンプルのJPQLクエリは有効なJPQLです。 HHH-5126 を参照してください。

191
Pascal Thivent

Oracleの制限は1000パラメーターです。この問題は、バージョン4.1.7のhibernateにより、渡されたパラメーターリストを500のセットに分割することで解決されました JIRA HHH-1123を参照

4
Ashish Thukral