2009-05-06 15 views
11

Wir versuchen, eine IN-Klausel für eine native SQL-Abfrage dynamisch zu generieren, um eine JPA-Entität zurückzugeben. Hibernate ist unser JPA-Anbieter. Unser Code sieht ungefähr so ​​aus.Verwenden der IN-Klausel in einer systemeigenen SQL-Abfrage

@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(); 

Dies funktioniert nicht, die in-Klausel erkennt keine der auf diese Weise übergebenen Werte. Kennt jemand eine Lösung für dieses Problem?

+0

wo ist Ihre Mutter SQL-Abfrage? –

Antwort

15

JPA unterstützt benannte Liste Parameter, in Ihrem Fall:

@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

Ich würde empfehlen, einen zusammengesetzten Parameter für Ihre Abfrage nicht zu verwenden, sondern ihn einzeln zu trennen. Geben Sie nicht ('NEW','OLD') an; Spezifizieren Sie separate Parameter von 'NEW' und 'OLD'. Das kann helfen.

Dies kann natürlich zu Problemen führen, wenn die Parameterlänge nicht definiert ist.