117 votes

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

J'ai construit une 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 est de remplir le paramètre :inclList avec une liste d'articles au lieu d'un seul élément. Par exemple si j'ai un new List<String>() { "a", "b", "c" } comment puis-je obtenir que, dans l' :inclList paramètre? Il ne me permet de codifier une chaîne de caractères. 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 tout simplement construire une chaîne de caractères et de construire la totalité de la Requête, mais je voulais éviter la surcharge. Est-il une meilleure manière de faire ceci?

Question connexe: si la Liste est très grande, est-il une bonne manière de construire la requête comme ça?

177voto

axtavt Points 126632

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") 
 

76voto

Jose Ferrer Points 71

Le format de requête JPA approprié serait:

 el.name IN :inclList
 

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

 el.name IN (:inclList)
 

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

29voto

user1114134 Points 111
 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X