2009-05-06 11 views
11

Stiamo provando a generare dinamicamente una clausola IN per una query sql nativa per restituire un'entità JPA. Hibernate è il nostro provider JPA. Il nostro codice è simile a questo.Utilizzo della clausola IN in una query sql nativa

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

Questo non funziona, la clausola in non riconosce nessuno dei valori passati in questo modo. Qualcuno sa di una soluzione a questo problema?

+0

dove è la vostra query SQL nativa? –

risposta

15

APP sostiene parametri della lista di nome, nel tuo caso:

@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

Si consiglia di non utilizzare un parametro composto per la query, ma di dividerlo singolarmente. Non specificare ('NEW','OLD'); specificare i parametri separati di 'NEW' e 'OLD'. Questo può aiutare.

Questo, naturalmente, può causare problemi se le lunghezze dei parametri non sono definite.

Problemi correlati