2010-11-10 16 views
6

Sto cercando di fare:Problema con i parametri posizionali a JPA interrogazione nativo

String sql = "SELECT email FROM users WHERE (type like 'B') AND (username like '?1')"; 
List results = em.createNativeQuery(sql).setParameter(1, username).getResultList(); 

Ma ottengo IllegalArgumentException che mi dice che il parametro è fuori limite. Che cosa sto facendo di sbagliato?

risposta

7

Non ci sono virgolette intorno ai parametri. Prova a modificare:

String sql = "SELECT email FROM users WHERE (type like 'B') AND (username like ?1)"; 

Si potrebbe anche voler controllare due volte che davvero dire type like 'B' come questo probabilmente non fa quello che pensi lo fa.

+0

Penso che siano 1-based (contrariamente alla logica) – Bozho

+1

@Bozho: sicuro? * Contrariamente a JDBC, Hibernate numera i parametri da zero. * Http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/objectstate.html#objectstate-querying-executing –

+0

Ah, corretto. Ho sempre usato parametri con nome, quindi questo mi ha eluso :) – Bozho

2

a) Perché utilizzare SQL nativo per una query semplice come questa? Usa JPQL.
b) Perché utilizzarlo come se non si usassero caratteri jolly? Utilizzare invece =.

String jpql = 
    "SELECT u.email FROM users u WHERE (u.type = 'B') AND (u.username = '?1')"; 

List results = 
    em.createQuery(jpql) 
     .setParameter(1, username) 
     .getResultList(); 
+2

Non ho una rappresentazione di oggetti per gli utenti, quindi, soprattutto perché è una semplice query, ho scelto Nativo. In realtà ho un DB grande con molte entità, tutto ben fatto con JPA, ma ho questo DB esterno che uso per 2-3 query (come questo), quindi ho preferito mantenerlo semplice con le query native. –

+0

Ok, sembra ragionevole –

Problemi correlati