web-dev-qa-db-ja.com

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

次のような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

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

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

112
AlanObject

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

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

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

el.name IN :inclList

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

el.name IN (:inclList)

しかし、それはバグです( HHH-5126 )(編集:現在解決済みです)。

69
Jose Ferrer
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で動作します

28
user1114134

以下に示すように、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();
8
Wesley Rocha