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