Читать книгу Desarrollo de aplicaciones web con Jakarta EE - César Francisco Castillo - Страница 27
2.6.2 Consultas parametrizadas
ОглавлениеJPQL permite definir dos tipos de parámetros:
* Por posición
* Por nombre
Los parámetros por nombres se representan con el carácter de dos puntos seguido de un nombre que servirá como identificador, por ejemplo: (:codEmpleado)
Los parámetros posicionales se representan con el carácter de interrogación seguido de un número: (?1). Una consulta puede contener más de un parámetro, y un mismo parámetro puede ser utilizado más de una vez en la misma consulta.
Aunque al principio podríamos pensar que los números que siguen al signo de interrogación denotan las posiciones en las que aparecen los parámetros en una expresión, debemos decir que esto no es así, ya que solo representan una referencia (que siempre debe comenzar con el valor 1 y no con un 0).
Ahora, supongamos que necesitamos obtener los datos de un determinado empleado. Para ello, definiremos una consulta que reciba como parámetro de entrada el código de Empleado. En el siguiente ejemplo trabajaremos con parámetros posicionales.
Lo primero que haremos será crear un método buscarEmpleado(), que será público y recibirá como parámetro un código de tipo entero que retornará una instancia de Empleado.
public Empleado buscarEmpleado (int codigo){…}
Luego, crearemos una cadena para representar la consulta y en ella incluiremos un parámetro posicional ?1, que luego será reemplazado.
String consulta = “SELECT e FROM Empleado e WHERE e.codigo = ?1”;
Entonces, mediante la interfaz de consultas, la crearemos.
Query q = em.createQuery(consulta);
Para establecer el valor del parámetro, utilizaremos el método setParameter() de la interfaz de consultas: colocaremos el número que corresponde junto al nombre de parámetro que recibe el método.
q.setParameter(1, codigo);
Por último, debemos retornar una instancia de tipo Empleado. Como q.getSingleResult() retorna una instancia de tipo Object, es necesario convertir (castear) su tipo a Empleado.
return (Empleado) q.getSingleResult();
La consulta terminada quedaría del siguiente modo:
La misma consulta pero con parámetros basados en nombres quedaría de la siguiente forma: