JPAクエリへのIN句リストの追加


124

次のようなNamedQueryを作成しました。

@NamedQuery(name = "EventLog.viewDatesInclude",
        query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND "
        + "el.timeMark <= :dateTo AND "
        + "el.name IN (:inclList)")

私がやりたいことは、パラメーター:inclListに、1つのアイテムではなくアイテムのリストを入力することです。たとえばnew List<String>() { "a", "b", "c" }、:inclListパラメータでそれを取得するにはどうすればよいですか?コード化できるのは1つの文字列だけです。例えば:

setParameter("inclList", "a") // works

setParameter("inclList", "a, b") // does not work

setParameter("inclList", "'a', 'b'") // does not work

setParameter("inclList", list) // throws an exception

文字列を作成し、それからクエリ全体を作成できることはわかっていますが、オーバーヘッドを避けたかったのです。これを行うより良い方法はありますか?

関連質問:リストが非常に大きい場合、そのようなクエリを作成する良い方法はありますか?


これはstackoverflow.com/questions/1557085/…の複製ですが、このスレッドは有用な回答を提供します。
マイクライアン

回答:


181

使用する場合はIN、コレクション値パラメータで、あなたは必要ありません(...)

@NamedQuery(name = "EventLog.viewDatesInclude", 
    query = "SELECT el FROM EventLog el WHERE el.timeMark >= :dateFrom AND " 
    + "el.timeMark <= :dateTo AND " 
    + "el.name IN :inclList") 

6
いいえ...私は私の反対です。:inclListを使用すると、機能しません。IN(:inclList)を使用すると機能します。
Gunjan Shah

1
また、言及に注意してください:paramの型はオブジェクトのコレクション(配列ではない)でなければなりません。オブジェクトはフィールドのタイプと一致する必要があります。.toString()はStringクラスの代わりにはなりません
dube

2
これは、Hibernateのバージョンで変更されたものだと思いますが、INを使用するときに変数の前後に括弧がないとエラーが発生することを覚えています。奇妙な、それは後方互換性がないかどう...
Tobb

1
これは実際に休止状態のバグ(括弧が必要)でしたが、3.6.1で修正されました
Mat

1
関連質問:リストが非常に大きい場合、実装に制限がある可能性があります。たとえば、Oracle 11g。マックス。パラメータとして1000個のリスト要素が可能です。回避策は、サブリストのリストを切り刻んで結果を収集することです。JPA自体はリストのサイズを制限しません。
MahttiasSchrebiér16年

81

適切なJPAクエリ形式は次のとおりです。

el.name IN :inclList

プロバイダーとしてHibernateの古いバージョンを使用している場合は、次のように記述する必要があります。

el.name IN (:inclList)

しかし、それはバグです(HHH-5126)(編集:これまでに解決されています)。


5
古いバージョンのHibernateの使用を区別していただきありがとうございます()
Rob L

31
public List<DealInfo> getDealInfos(List<String> dealIds) {
        String queryStr = "SELECT NEW com.admin.entity.DealInfo(deal.url, deal.url, deal.url, deal.url, deal.price, deal.value) " + "FROM Deal AS deal where deal.id in :inclList";
        TypedQuery<DealInfo> query = em.createQuery(queryStr, DealInfo.class);
        query.setParameter("inclList", dealIds);
        return query.getResultList();
    }

JPA 2、Jboss 7.0.2で動作します


9

List次のように変換する必要があります。

    String[] valores = hierarquia.split(".");       
    List<String> lista =  Arrays.asList(valores);

    String jpqlQuery = "SELECT a " +
            "FROM AcessoScr a " +
            "WHERE a.scr IN :param ";

    Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class);                   
    query.setParameter("param", lista);     
    List<AcessoScr> acessos = query.getResultList();

この回答が役に立ちました
cabaji99
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.