unidades:05_hibernate_query_language:03_parametros
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:05_hibernate_query_language:03_parametros [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Parámetros ====== | ||
+ | En las lecciones anteriores hemos visto cómo, al lanzar una consulta, incluíamos directamente el valor de los parámetros del '' | ||
+ | |||
+ | \\ | ||
+ | |||
+ | |||
+ | <code java 1> | ||
+ | String nombre=" | ||
+ | String ape1=" | ||
+ | String ape2=" | ||
+ | |||
+ | Query query = session.createQuery(" | ||
+ | List< | ||
+ | for (Profesor profesor : profesores) { | ||
+ | System.out.println(profesor.toString()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Como vemos en la línea 2 hemos hecho concatenación de Strings con lo que podrían hacernos [[wpes> | ||
+ | |||
+ | ===== Modelo ===== | ||
+ | En los ejemplos que vamos a realizar van a usarse las siguientes clases Java y tablas, que sólo mostraremos en formato UML. No vamos a poner el código fuente ni los ficheros de hibernate de mapeo ya que aún no han sido explicadas en lecciones anteriores todas la características que usan. | ||
+ | |||
+ | ==== Modelo de Java ==== | ||
+ | El modelo de clases Java es el siguiente: | ||
+ | |||
+ | <uml> | ||
+ | class Profesor | ||
+ | Profesor : int id | ||
+ | Profesor : String nombre | ||
+ | Profesor : String ape1 | ||
+ | Profesor : String ape2 | ||
+ | </ | ||
+ | |||
+ | ==== Modelo de Tablas ==== | ||
+ | El modelo de tablas es el siguiente: | ||
+ | |||
+ | <uml> | ||
+ | class Profesor << | ||
+ | Profesor : INTEGER id | ||
+ | Profesor : VARCHAR nombre | ||
+ | Profesor : VARCHAR ape1 | ||
+ | Profesor : VARCHAR ape2 | ||
+ | </ | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | Veamos ahora la forma de usar los parámetros en Hibernate.A diferencia de SQL en la que sólo hay una forma de usar parámetros, | ||
+ | |||
+ | * [[# | ||
+ | * [[#Nombre]] | ||
+ | |||
+ | ===== Posicional ===== | ||
+ | Esta forma de definir parámetros es muy similar a la que usa SQL.Se basa en definir cada parámetro como un interrogante "''?''" | ||
+ | Posteriormente estableceremos a la clase <javadoc h41> | ||
+ | |||
+ | <code java 1> | ||
+ | String nombre=" | ||
+ | String ape1=" | ||
+ | String ape2=" | ||
+ | |||
+ | Query query = session.createQuery(" | ||
+ | query.setString(0, | ||
+ | query.setString(1, | ||
+ | query.setString(2, | ||
+ | |||
+ | List< | ||
+ | for (Profesor profesor : profesores) { | ||
+ | System.out.println(profesor.toString()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * En la línea 5 se define en la consulta HQL cada uno de los 3 parámetros mediante un interrogante "''?''" | ||
+ | * En las líneas 6, 7 y 8 se añaden los valores de los parámetros mediante el método <javadoc h41> | ||
+ | * El resto de las líneas ya son iguales a cuando no se usaban parámetros. | ||
+ | |||
+ | <note tip> | ||
+ | En caso de que el tipo de parámetro no sea un String, en vez de usar el método <javadoc h41> | ||
+ | |||
+ | Por ejemplo, para un '' | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Recuerda que el índice de los parámetros empieza por 0. | ||
+ | </ | ||
+ | |||
+ | ===== Nombre ===== | ||
+ | En este caso los parámetros se definen como nombre precedidos de dos puntos "'':''" | ||
+ | |||
+ | <code java 1> | ||
+ | String nombre=" | ||
+ | String ape1=" | ||
+ | String ape2=" | ||
+ | |||
+ | Query query = session.createQuery(" | ||
+ | query.setString(" | ||
+ | query.setString(" | ||
+ | query.setString(" | ||
+ | |||
+ | List< | ||
+ | for (Profesor profesor : profesores) { | ||
+ | System.out.println(profesor.toString()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * En la línea 5 se puede ver cómo ahora los parámetros son nombres precedidos de dos puntos.En nuestro ejemplo los parámetros son "'': | ||
+ | * En las líneas 6 , 7 y 8 se asigna valor a los parámetros mediante el método <javadoc h41> | ||
+ | * El resto del código ya es igual al caso anterior. | ||
+ | |||
+ | <note tip> | ||
+ | Recuerda que al establecer los valores de los parámetros en el nombre no hay que poner los dos puntos. | ||
+ | |||
+ | En caso de que erróneamente pongamos los 2 puntos:< | ||
+ | query.setString(": | ||
+ | </ | ||
+ | Se producirá la excepción: | ||
+ | Exception in thread " | ||
+ | </ | ||
+ | |||
+ | ===== Otras mejoras ===== | ||
+ | La clase <javadoc h41> | ||
+ | |||
+ | ==== setParameter ==== | ||
+ | Hemos visto cómo el método que usamos para establecer el valor de un parámetro es específico del tipo de dicho parámetro. Ësto hace que tengamos que tenerlo en cuenta al escribir el código con la molestia que ello conlleva. | ||
+ | |||
+ | Para mejorar este hecho existe otra forma de asignar valores a los parámetros que es independiente del tipo.Los métodos son <javadoc h41> | ||
+ | |||
+ | En ese caso el código quedaría | ||
+ | <code java 1> | ||
+ | String nombre=" | ||
+ | String ape1=" | ||
+ | String ape2=" | ||
+ | |||
+ | Query query = session.createQuery(" | ||
+ | query.setParameter(" | ||
+ | query.setParameter(" | ||
+ | query.setParameter(" | ||
+ | |||
+ | List< | ||
+ | for (Profesor profesor : profesores) { | ||
+ | System.out.println(profesor.toString()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Vemos en las líneas 6, 7 y 8 cómo se ha hecho uso del nuevo método <javadoc h41> | ||
+ | ==== Métodos encadenados ==== | ||
+ | Todos los métodos de la clase <javadoc h41> | ||
+ | |||
+ | ¿Por qué retornar un objeto <javadoc h41> | ||
+ | |||
+ | Hacer que los métodos retornen el mismo objeto que los llama es muy útil para poder encadenar métodos sin volver a hacer referencia al objeto. | ||
+ | |||
+ | Veamos un ejemplo para entender la utilidad ésto: | ||
+ | <code java 1> | ||
+ | String nombre=" | ||
+ | String ape1=" | ||
+ | String ape2=" | ||
+ | |||
+ | Query query = session.createQuery(" | ||
+ | .setParameter(" | ||
+ | |||
+ | List< | ||
+ | for (Profesor profesor : profesores) { | ||
+ | System.out.println(profesor.toString()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | * En la línea 5 vemos cómo no se pone el punto y coma final ya que la línea no ha acabado. | ||
+ | * En la línea 6 (que es continuación de la anterior) se encadenan las 3 llamadas a <javadoc h41> | ||
+ | |||
+ | Otra forma de poner los parámetros sería: | ||
+ | <code java 1> | ||
+ | Query query = session.createQuery(" | ||
+ | .setParameter(" | ||
+ | .setParameter(" | ||
+ | .setParameter(" | ||
+ | </ | ||
+ | |||
+ | En cualquier caso la forma de poner los parámetros es más una cuestión estética que de funcionamiento. | ||