unidades:05_hibernate_query_language:04_colecciones
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:05_hibernate_query_language:04_colecciones [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== Objetos y colecciones ====== | ||
+ | En este tema volvemos | ||
+ | Hasta ahora el HQL es un lenguaje de consultas muy similar a SQL sólo que usando como modelo de datos subyacente clases Java en vez de Tablas SQL. Sin embargo, | ||
+ | |||
+ | ===== 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 no todas la características que usan han sido explicadas en lecciones anteriores. | ||
+ | |||
+ | ==== Modelo de Java ==== | ||
+ | El modelo de clases Java es el siguiente: | ||
+ | |||
+ | <uml> | ||
+ | class Profesor | ||
+ | Profesor : int id | ||
+ | |||
+ | class Nombre | ||
+ | Nombre : String nombre | ||
+ | Nombre : String ape1 | ||
+ | Nombre : String ape2 | ||
+ | |||
+ | class Direccion | ||
+ | Direccion : int id | ||
+ | Direccion : String calle | ||
+ | Direccion : int numero | ||
+ | Direccion : String provincia | ||
+ | |||
+ | class Municipio | ||
+ | Municipio : int idMunicipio | ||
+ | Municipio : String codProvincia | ||
+ | Municipio : String codMunicipio | ||
+ | Municipio : String nombre | ||
+ | |||
+ | class CorreoElectronico | ||
+ | CorreoElectronico: | ||
+ | CorreoElectronico: | ||
+ | |||
+ | |||
+ | Profesor " | ||
+ | Profesor " | ||
+ | Profesor " | ||
+ | Direccion " | ||
+ | </ | ||
+ | ==== 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 | ||
+ | |||
+ | |||
+ | class CorreoElectronico << | ||
+ | CorreoElectronico: | ||
+ | CorreoElectronico: | ||
+ | CorreoElectronico: | ||
+ | |||
+ | class Direccion << | ||
+ | Direccion : INTEGER id | ||
+ | Direccion : VARCHAR calle | ||
+ | Direccion : INTEGER numero | ||
+ | Direccion : VARCHAR IdMunicipio | ||
+ | Direccion : VARCHAR provincia | ||
+ | |||
+ | class Municipio << | ||
+ | Municipio : INTEGER idMunicipio | ||
+ | Municipio : VARCHAR codProvincia | ||
+ | Municipio : VARCHAR codMunicipio | ||
+ | Municipio : VARCHAR nombre | ||
+ | |||
+ | Profesor " | ||
+ | Profesor " | ||
+ | Direccion " | ||
+ | </ | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | |||
+ | Las características especificas de HQL por usar como modelo clases Java son: | ||
+ | * [[# | ||
+ | * [[# | ||
+ | |||
+ | ==== Navegación por propiedades ==== | ||
+ | Una característica de HQL es la posibilidad de navegar por las propiedades. | ||
+ | |||
+ | En HQL si referenciamos una propiedad de un clase Java , esta propiedad puede no ser un valor escalar sino una referencia a otro objeto Java, que a su vez tiene más propiedades, | ||
+ | |||
+ | Por ejemplo: | ||
+ | <code sql> | ||
+ | SELECT p.nombre.ape1 FROM Profesor p | ||
+ | </ | ||
+ | |||
+ | Aquí vemos cómo desde objeto '' | ||
+ | |||
+ | Los mismo se puede hacer con el nombre del municipio. | ||
+ | <code sql|Mostrar el Id y el municipio de cada profesor> | ||
+ | SELECT p.nombre.ape1, | ||
+ | </ | ||
+ | Desde la clase '' | ||
+ | |||
+ | Realmente esta característica es la misma que hacemos desde Java usando los métodos '' | ||
+ | |||
+ | <code java> | ||
+ | Profesor profesor=......; | ||
+ | | ||
+ | String nombreMunicipio=profesor.getDireccion().getMunicipio().getNombre(); | ||
+ | </ | ||
+ | |||
+ | Así que no debe extrañarnos que podamos realizarlo desde HQL. | ||
+ | |||
+ | <note tip> | ||
+ | Si comprobamos la SQL que lanza Hibernate , podemos comprobar que lanza una SELECT en la que realiza todos los '' | ||
+ | |||
+ | Así que esta característica de Hibernate es muy útil y potente. | ||
+ | |||
+ | <code sql> | ||
+ | SELECT | ||
+ | profesor0_.ape1 AS col_0_0_, | ||
+ | municipio2_.NombreMunicipio AS col_1_0_ | ||
+ | FROM | ||
+ | Profesor profesor0_, | ||
+ | Direccion direccion1_, | ||
+ | Municipios municipio2_ | ||
+ | WHERE | ||
+ | profesor0_.Id=direccion1_.Id AND | ||
+ | direccion1_.idMunicipio=municipio2_.idMunicipio | ||
+ | </ | ||
+ | </ | ||
+ | ==== Colecciones ==== | ||
+ | Otra característica de HQL es la posibilidad de tratar con colecciones dentro de la propia consulta. Veamos las funciones que tratan con colecciones. | ||
+ | |||
+ | | ||
+ | |||
+ | * '' | ||
+ | SELECT p.nombre.ape1, | ||
+ | </ | ||
+ | * '' | ||
+ | SELECT p.nombre FROM Profesor p WHERE p.correosElectronicos IS EMPTY | ||
+ | </ | ||
+ | * '' | ||
+ | SELECT p.nombre FROM Profesor p WHERE p.correosElectronicos IS NOT EMPTY | ||
+ | </ | ||
+ | * '' | ||
+ | * '' |