JPA Hibernate. Parámetros en Queries nativas

por | enero 10, 2015

Cuando usamos Named Queries generalmente usamos también Named Parameters, Nuestra  Named Query puede ser algo así:

[java]
Select e from Tabla e where e.campo.campo = :parametro
[/java]

Y establecemos el parametro algo así:

[java]
query.setParameter("parametro", 666.66);
[/java]

Pero si intentamos hacer lo mismo para Native Queries, muchas de las veces no funciona.

[java]
SELECT campo_tabla FROM tabla WHERE otro_campo = :parametro
[/java]

He tenido este error en consultas nativas de este tipo:

[java]
SELECT campo FROM tabla
where fecha BETWEEN TO_DATE(:fechaInicio,’mm-yyyy’) …

SELECT campo FROM tabla
where fecha BETWEEN TO_DATE(‘:fechaInicio’,’mm-yyyy’) …
[/java]

De las dos formas tenía un error de que no se podía localizar el parámetro.

En la especificación de JPA indica que los Named Parameters no están soportados para consultas nativas.

Named parameters follow the rules for identifiers defined in Section 4.4.1. The use of named parameters applies to the Java Persistence query language, and is not defined for native queries. Only positional parameter binding may be portably used for native queries.

Para resolver el problema se debe usar como indica la especificación Positional Parameter, algo asi:

[java]
SELECT campo FROM tabla
where fecha BETWEEN TO_DATE(?1,’mm-yyyy’)…

query.setParameter(1, fecha);
[/java]

En el enlace de fuente otras formas de usar Named Parameters con consultas nativas, algo tosco para mi gusto. Esto sobre un ambiente de Hibernate 3.x.
Espero les sea de utilidad.

Fuente: http://stackoverflow.com/questions/3144235/jpa-hibernate-native-queries-do-not-recognize-parameters

EOF