JPQL IN句:Java配列(またはリスト、セット…)?


108

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

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

回答:


208

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

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を参照してください。


5
「節」で使用する名前の最大数はありますか?
ゴンディム2011年

3
前述の

1
@pringlesinn IN句の値の数は、DBMSによって異なります
TimBütheOct

JPA 1.0で動作します(括弧で囲む必要はありませんが、読みやすくするために必要です)
Javier Larios 2018年

=> item.name(:namesなど)を使用したい場合
dzgeek '23 / 10/23

3

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


1
残念ながら、これは解決されませんでした。チケットには解決済みのマークが付けられましたが、問題(コメントで示されている)はHibernateチームによって修正されていません。
Druckles、2018

@Druckles umどこ?2016年より前のコメントはありません。これらのコメントは、通常のインターネットの「help plz !!! 11 !!!!」以外に何も言っていない2つのコメントでした。解決済みのバグレポートを信頼する理由はありません。
searchengine27

@ searchengine27 解決済みとマークされていても、レポートは解決されなかったと言いました。解決策は、Steve Ebersoleによって報告されたとおりです。「これに対する解決策は、この状態が検出されたときにログを介してユーザーに警告するだけです。」2012年にノエルトラウトが書いたコメントは、これが十分ではない理由をさらに詳しく説明しています。
Druckles

つまり、この答えは間違っているか、せいぜい誤解を招くだけです。
Druckles
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.