2010-11-10 16 views
6

estoy tratando de hacer:problema con los parámetros posicionales en la APP consulta nativa

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

Pero consigo IllegalArgumentException que me dice que el parámetro está fuera de límites. ¿Qué estoy haciendo mal?

Respuesta

7

No debe haber comillas en los parámetros. Tal vez puedas probar:

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

También puede ser que desee volver a verificar que realmente quiere decir type like 'B' ya que esto probablemente no hace lo que usted cree.

+0

Creo que están basados ​​en 1 (contrario a la lógica) – Bozho

+1

@Bozho: ¿Seguro? * Contrariamente a JDBC, Hibernate numera los parámetros desde cero. * Http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/objectstate.html#objectstate-querying-executing –

+0

Ah, correcto. Siempre he usado parámetros con nombre, así que esto me ha escapado :) – Bozho

2

a) ¿Por qué usaría SQL nativo para una consulta simple como esta? Use JPQL.
b) ¿Por qué usar como si no usara comodines? Use = en su lugar.

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

No tengo una representación de objeto para los usuarios, así que especialmente porque es una consulta simple, elegí Native. De hecho, tengo una gran base de datos con muchas entidades, todo muy bien con JPA, pero tengo esta base de datos externa que utilizo para 2-3 consultas (como esta), así que opté por mantenerlo simple con las consultas nativas. –

+0

Ok, eso suena sensato –

Cuestiones relacionadas