2010-12-07 30 views
90

J'ai construit une NamedQuery qui ressemble à ceci:Additionnant dans la clause Liste à une Assemblée parlementaire paritaire de requête

@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 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 pouvais construire une chaîne et construire l'ensemble requête à partir, 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 grande, y a-t-il un bon moyen de créer une requête comme celle-là?

Répondre

137

Lors de l'utilisation IN avec un paramètre valeur est une collection que vous n'avez pas besoin (...):

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

Ce fut, merci. – AlanObject

+6

Non ... J'ai mon cas son contraire. Si j'utilise: inclList alors ça ne marche pas. Si j'utilise IN (: inclList) alors cela fonctionne. –

+1

Notez également: le type de votre param doit être une collection (pas un tableau) d'objets. Les objets doivent correspondre au type du champ. .toString() ne remplace pas la classe String – dube

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

Works pour moi avec JPA 2, Jboss 7.0.2

53

Le format de requête appropriée JPA serait:

el.name IN :inclList 

Si vous utilisez une ancienne version d'Hibernate comme pr ovider vous devez écrire:

el.name IN (:inclList) 

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

+1

Merci d'avoir distingué les anciennes versions d'Hibernate() –

5

Vous devez convertir à 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(); 
+0

Cette réponse m'a aidé – cabaji99