web-dev-qa-db-fra.com

Ajout de la liste de clauses IN à une requête JPA

J'ai construit un NamedQuery qui ressemble à ceci:

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

Ce que je veux faire, c'est renseigner le paramètre: inclList avec une liste d'éléments au lieu d'un élément. Par exemple, si j'ai une new List<String>() { "a", "b", "c" }, comment l'obtenir dans le paramètre: inclList? Cela me permet seulement de codifier une chaîne. Par exemple:

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

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

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

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

Je sais que je pourrais simplement créer une chaîne et construire toute la requête à partir de cela, mais je voulais éviter les frais généraux. Existe-t-il une meilleure façon de le faire?

Question connexe: si la liste est très longue, existe-t-il un bon moyen de créer une requête de ce type?

113
AlanObject

Lorsque vous utilisez IN avec un paramètre de valeur de collection, vous n'avez pas besoin de (...):

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

Le format de requête JPA approprié serait:

el.name IN :inclList

Si vous utilisez une ancienne version de Hibernate en tant que fournisseur, vous devez écrire:

el.name IN (:inclList)

mais c'est un bogue ( HHH-5126 ) (EDIT: qui a été résolu maintenant).

72
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();
    }

Fonctionne pour moi avec JPA 2, Jboss 7.0.2

28
user1114134

Vous devez convertir en List comme indiqué ci-dessous:

    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