Herramientas de usuario

Herramientas del sitio


unidades:05_hibernate_query_language:04_colecciones

Objetos y colecciones

En este tema volvemos a ver mas características del Hibernate Query Languaje (HQL).

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, el hecho de usar clases Java le hace tener características que no existen en SQL 1) al estar éste último basado en Tablas.

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:


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: int idCorreo
CorreoElectronico: String direccionCorreo


Profesor "1" -- "0..n" CorreoElectronico: correosElectronicos
Profesor "1" -- "1" Nombre : nombre
Profesor "1" -- "1" Direccion : direccion
Direccion "*" -- "1" Municipio : municipio

Modelo de Tablas

El modelo de tablas es el siguiente:


class Profesor <>
Profesor : INTEGER id
Profesor : VARCHAR nombre
Profesor : VARCHAR ape1
Profesor : VARCHAR ape2


class CorreoElectronico <
>
CorreoElectronico: INTEGER idCorreo
CorreoElectronico: VARCHAR direccionCorreo
CorreoElectronico: INTEGER idProfesor

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 "1" -- "0..n" CorreoElectronico
Profesor "1" -- "1" Direccion
Direccion "*" -- "1" Municipio

Las características especificas de HQL por usar como modelo clases Java son:

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, lo que a su vez nos puede llevas hasta otro objeto Java y así sucesivamente. Es decir, podemos acceder a propiedades de Clases que no están en la cláusula FROM pero accedemos a ellas desde la clase inicial de la consulta.

Por ejemplo:

SELECT p.nombre.ape1 FROM Profesor p

Aquí vemos cómo desde objeto Profesor se navega mediante la propiedad nombre a la clase Nombre y de ahí a su propiedad ape1.

Los mismo se puede hacer con el nombre del municipio.

el Id y el municipio de cada profesor
SELECT p.nombre.ape1,p.direccion.municipio.nombre FROM Profesor p

Desde la clase Profesor se navega hacia la clase Direccion mediante la propiedad direccion y desde ésta al Municipio mediante la propiedad municipio donde finalmente se accede a la propiedad nombre de la claseMunicipio .

Realmente esta característica es la misma que hacemos desde Java usando los métodos get de cada clase Java y encadenando las llamadas. En código Java la navegación anterior quedaría de la siguiente forma:

Profesor profesor=......;
 
String nombreMunicipio=profesor.getDireccion().getMunicipio().getNombre();

Así que no debe extrañarnos que podamos realizarlo desde HQL.

Si comprobamos la SQL que lanza Hibernate , podemos comprobar que lanza una SELECT en la que realiza todos los JOINS necesarios para acceder a todas las tablas que realmente necesita, pero desde nuestro punto de vista sólo navegamos por propiedades Java.

Así que esta característica de Hibernate es muy útil y potente.

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.

  • SIZE©: Obtiene el nº de elementos de una colección.
    cada municipio obtiene el nº de reparaciones
    SELECT p.nombre.ape1,SIZE(p.correosElectronicos) FROM Profesor p Group by p.nombre.ape1
  • c IS EMPTY: Comprueba si una colección no tiene elementos.
    los municipios sin reparaciones
    SELECT p.nombre FROM Profesor p WHERE p.correosElectronicos IS EMPTY
  • IS NOT EMPTY c: Comprueba si una colección tiene elementos.
    los municipios con reparaciones
    SELECT p.nombre FROM Profesor p WHERE p.correosElectronicos IS NOT EMPTY
  • MINELEMENT©: Retorna el menor de los elementos de la colección. Para averiguar cual es el menor siempre usa el campo que hace de id.
  • MAXELEMENT©: Retorna el mayor de los elementos de la colección. Para averiguar cual es el mayor siempre usa el campo que hace de id.
1)
al menos en el SQL Estándar
unidades/05_hibernate_query_language/04_colecciones.txt · Última modificación: 2023/04/07 21:26 por 127.0.0.1