2009-05-06 6 views
11

Nous essayons de générer dynamiquement une clause IN pour une requête SQL native afin de renvoyer une entité JPA. Hibernate est notre fournisseur JPA. Notre code ressemble à ceci.Utilisation de la clause IN dans une requête SQL native

@NamedQuery(
    name="fooQuery", 
    queryString="select f from Foo f where f.status in (?1)" 
) 

.... 

Query q = entityManager.createNamedQuery("fooQuery"); 
q.setParameter(1, "('NEW','OLD')"); 
return q.getResultList(); 

Cela ne fonctionne pas, la clause in ne reconnaît aucune des valeurs transmises de cette manière. Est-ce que quelqu'un sait d'une solution à ce problème?

+0

où est votre requête SQL native? –

Répondre

15

JPA soutient les paramètres de liste nommés, dans votre cas:

@NamedQuery(
    name="fooQuery", 
    queryString="select f from Foo f where f.status in (?1)" 
) 

Query q = entityManager.createNamedQuery("fooQuery"); 

List<String> listParameter = new ArrayList<>(); 
listParameter.add("NEW"); 
listParameter.add("OLD"); 

q.setParameter(1, listParameter); 
return q.getResultList(); 
0

Je recommande de ne pas utiliser un paramètre composite pour votre requête, mais de le diviser individuellement. Ne spécifiez pas ('NEW','OLD'); spécifiez des paramètres séparés de 'NEW' et 'OLD'. Cela peut aider.

Cela peut, bien sûr, causer des problèmes si vos longueurs de paramètre ne sont pas définies.

Questions connexes