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’éléments au lieu d’un élément. Par exemple, si j’ai une new List() { "a", "b", "c" } comment puis-je obtenir cela 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 juste construire une chaîne et construire la requête entière à partir de cela, mais je voulais éviter la surcharge. Existe-t-il une meilleure façon de le faire?

Question connexe: si la liste est très volumineuse, existe-t-il un bon moyen de créer une requête comme celle-là?

Lorsque vous utilisez IN avec un paramètre 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") 

Le format de requête JPA approprié serait:

 el.name IN :inclList 

Si vous utilisez une ancienne version d’Hibernate comme fournisseur, vous devez écrire:

 el.name IN (:inclList) 

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

 public List getDealInfos(List dealIds) { Ssortingng 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 query = em.createQuery(queryStr, DealInfo.class); query.setParameter("inclList", dealIds); return query.getResultList(); } 

Fonctionne pour moi avec JPA 2, Jboss 7.0.2

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

  Ssortingng[] valores = hierarquia.split("."); List lista = Arrays.asList(valores); Ssortingng jpqlQuery = "SELECT a " + "FROM AcessoScr a " + "WHERE a.scr IN :param "; Query query = getEntityManager().createQuery(jpqlQuery, AcessoScr.class); query.setParameter("param", lista); List acessos = query.getResultList();