unidades:05_hibernate_query_language:02_hql
Diferencias
Muestra las diferencias entre dos versiones de la página.
— | unidades:05_hibernate_query_language:02_hql [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1 | ||
---|---|---|---|
Línea 1: | Línea 1: | ||
+ | ====== HQL ====== | ||
+ | El Hibernate Query Languaje (HQL) es el lenguaje de consultas que usa Hibernate para obtener los objetos desde la base de datos. Su principal particularidad es que las consultas se realizan sobre los objetos java que forman nuestro modelo de negocio, es decir, las entidades que se persisten en Hibernate. Ésto hace que HQL tenga las siguientes características: | ||
+ | * Los tipos de datos son los de Java. | ||
+ | * Las consultas son independientes del lenguaje de SQL específico de la base de datos | ||
+ | * Las consultas son independientes del modelo de tablas de la base de datos. | ||
+ | * Es posible tratar con las colecciones de Java. | ||
+ | * Es posible navegar entre los distintos objetos en la propia consulta. | ||
+ | <note important> | ||
+ | Vuelvo a insistir sobre al apartado anterior. En Hibernate las consultas HQL se lanzan (o se ejecutan) sobre el modelo de entidades que hemos definido en Hibernate, esto es, sobre nuestras clases de negocio. | ||
+ | |||
+ | De forma poco ortodoxa se podría ver cómo que nuestro //modelo de tablas// en HQL son las clases Java y **NO** las tablas de la base de datos. Es decir que cuando hagamos "'' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== 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 todas la características que usan en lecciones anteriores. | ||
+ | |||
+ | ==== 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 | ||
+ | |||
+ | class Ciclo | ||
+ | Ciclo : int idCiclo | ||
+ | Ciclo : String nombre | ||
+ | Ciclo : int horas | ||
+ | |||
+ | class TiposBasicos | ||
+ | TiposBasicos : int inte | ||
+ | TiposBasicos : long long1 | ||
+ | TiposBasicos : short short1 | ||
+ | TiposBasicos : float float1 | ||
+ | TiposBasicos : double double1 | ||
+ | TiposBasicos : char character1 | ||
+ | TiposBasicos : byte byte1 | ||
+ | TiposBasicos : boolean boolean1 | ||
+ | TiposBasicos : boolean yesno1 | ||
+ | TiposBasicos : boolean truefalse1 | ||
+ | TiposBasicos : String stri | ||
+ | TiposBasicos : Date dateDate | ||
+ | TiposBasicos : Date dateTime | ||
+ | TiposBasicos : Date dateTimestamp | ||
+ | TiposBasicos : String texto | ||
+ | TiposBasicos : byte[] binario | ||
+ | TiposBasicos : BigDecimal bigDecimal | ||
+ | TiposBasicos : BigInteger bigInteger | ||
+ | </ | ||
+ | ==== 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 CicloFormativo << | ||
+ | CicloFormativo: | ||
+ | CicloFormativo: | ||
+ | CicloFormativo: | ||
+ | |||
+ | class TiposBasicos << | ||
+ | TiposBasicos : INTEGER inte | ||
+ | TiposBasicos : BIGINT long1 | ||
+ | TiposBasicos : SMALLINT short1 | ||
+ | TiposBasicos : FLOAT float1 | ||
+ | TiposBasicos : DOUBLE double1 | ||
+ | TiposBasicos : CHAR[1] character1 | ||
+ | TiposBasicos : TINYINT byte1 | ||
+ | TiposBasicos : TINYINT boolean1 | ||
+ | TiposBasicos : CHAR[1] yesno1 | ||
+ | TiposBasicos : CHAR[1] truefalse1 | ||
+ | TiposBasicos : VARCHAR[255] stri | ||
+ | TiposBasicos : DATE dateDate | ||
+ | TiposBasicos : TIME dateTime | ||
+ | TiposBasicos : DATETIME dateTimestamp | ||
+ | TiposBasicos : LONGTEXT texto | ||
+ | TiposBasicos : TINYBLOB binario | ||
+ | TiposBasicos : DECIMAL bigDecimal | ||
+ | TiposBasicos : DECIMAL bigInteger | ||
+ | </ | ||
+ | |||
+ | Podemos ver cómo hay un par de diferencias entre el modelo en Java y el modelo de tablas. | ||
+ | * Para la clase '' | ||
+ | * En la clase '' | ||
+ | |||
+ | \\ | ||
+ | |||
+ | ===== ===== | ||
+ | |||
+ | |||
+ | Veamos ahora un sencillo ejemplo de consulta en HQL | ||
+ | |||
+ | <code sql> | ||
+ | SELECT c FROM Ciclo c ORDER BY nombre | ||
+ | </ | ||
+ | |||
+ | ¿Qué diferencias podemos ver entre HQL y SQL? | ||
+ | * '' | ||
+ | * Es necesario definir el alias '' | ||
+ | * Tras la palabra '' | ||
+ | * Al ordenar los objetos se usa la propiedad '' | ||
+ | |||
+ | <note warning> | ||
+ | Recuerda incluir el alias en la consulta HQL. Si no se hace y se deja la consulta de la siguiente forma: | ||
+ | <code sql> | ||
+ | SELECT Ciclo FROM Ciclo | ||
+ | </ | ||
+ | se producirá la siguiente excepción: | ||
+ | |||
+ | java.lang.NullPointerException | ||
+ | </ | ||
+ | |||
+ | <note tip> | ||
+ | Hibernate soporta **no** incluir la parte del '' | ||
+ | <code sql> | ||
+ | FROM Ciclo | ||
+ | </ | ||
+ | pero en la propia documentación se recomienda no hacerlo (( [[http:// | ||
+ | |||
+ | Se ha hecho mención de esta característica ya que en muchos tutoriales que se encuentran por Internet se hace uso de ella. | ||
+ | </ | ||
+ | ===== Mayusculas ===== | ||
+ | Respecto a la sensibilidad de las mayúsculas y minúsculas , el lenguaje HQL sí que lo es, pero con matices. | ||
+ | * Las palabras clave del lenguaje **NO** son sensibles a las mayúsculas o minúsculas. | ||
+ | * Las siguientes 2 consultas son equivalentes.< | ||
+ | select count(*) from Ciclo | ||
+ | </ | ||
+ | SELECT COUNT(*) FROM Ciclo | ||
+ | </ | ||
+ | * El nombre de las clases Java y sus propiedades **SI** | ||
+ | * La siguiente consulta HQL es correcta< | ||
+ | SELECT c.nombre FROM Ciclo c WHERE nombre=' | ||
+ | </ | ||
+ | * La siguiente consulta HQL es **errónea** ya que la propiedad '' | ||
+ | SELECT c.Nombre FROM Ciclo c WHERE Nombre=' | ||
+ | </ | ||
+ | * La siguiente consulta HQL es **errónea** ya que el nombre de la clase Java '' | ||
+ | SELECT c.nombre FROM ciclo c WHERE nombre=' | ||
+ | </ | ||
+ | * Al realizar comparaciones con los valores de las propiedades, | ||
+ | * Las siguientes 2 consultas retornan los mismos objetos< | ||
+ | SELECT c.nombre FROM Ciclo c WHERE nombre=' | ||
+ | </ | ||
+ | SELECT c.nombre FROM Ciclo c WHERE nombre=' | ||
+ | </ | ||
+ | ===== Filtrando ===== | ||
+ | Al igual que en SQL en HQL también podemos filtrar los resultados mediante la cláusula '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT p FROM Profesor p WHERE nombre=' | ||
+ | </ | ||
+ | |||
+ | Al igual que con el nombre de la clase, el nombre de los campos del '' | ||
+ | ==== Literales ==== | ||
+ | |||
+ | === Texto === | ||
+ | El carácter para indicar un literal de texto es la comilla simple no pudiéndose usar la doble comilla. | ||
+ | |||
+ | <code sql> | ||
+ | SELECT p FROM Profesor p WHERE nombre=' | ||
+ | </ | ||
+ | |||
+ | Si se quiere usar la comilla dentro de un literal deberemos duplicarla. | ||
+ | |||
+ | <code sql> | ||
+ | SELECT p FROM Profesor p WHERE ape1=' | ||
+ | </ | ||
+ | |||
+ | === Integer === | ||
+ | Para incluir un número del tipo '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE inte=4 | ||
+ | </ | ||
+ | |||
+ | === Long === | ||
+ | Para incluir un número del tipo '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE long1=4L | ||
+ | </ | ||
+ | |||
+ | === double === | ||
+ | Para representar un '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE double1=1.45 | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE double1=1.7976931348623157E308 | ||
+ | </ | ||
+ | |||
+ | === float === | ||
+ | Para representar un '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE float1=1.45F | ||
+ | </ | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE float1=3.4028235E38F | ||
+ | </ | ||
+ | |||
+ | === Fecha === | ||
+ | Para indicar una fecha la incluiremos entre comillas simples con el formato '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE dateDate=' | ||
+ | </ | ||
+ | |||
+ | === Hora === | ||
+ | Para indicar una hora la incluiremos entre comillas simples con el formato '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE dateTime=' | ||
+ | </ | ||
+ | |||
+ | === Fecha y hora === | ||
+ | Para indicar una fecha y hora la incluiremos entre comillas simples con el formato '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE dateTime=' | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Operadores de comparación ==== | ||
+ | Para comparar los datos en una expresión se pueden usar las siguientes Operadores: | ||
+ | |||
+ | * Signo igual "'' | ||
+ | * Signo mayor que "''>''": | ||
+ | * Signo mayor que "''> | ||
+ | * Signo mayor que "''<''": | ||
+ | * Signo mayor que "''< | ||
+ | * Signo desigual "''<>''": | ||
+ | * Signo desigual "'' | ||
+ | * Operador "'' | ||
+ | * Operador "'' | ||
+ | * Operador "'' | ||
+ | * Operador "'' | ||
+ | * expresión "'' | ||
+ | |||
+ | ==== Operadores Lógicos ==== | ||
+ | Se puede hacer uso de los típicos operadores lógicos como en SQL: | ||
+ | * AND | ||
+ | * OR | ||
+ | * NOT<code sql> | ||
+ | SELECT p FROM Profesor p WHERE nombre=' | ||
+ | </ | ||
+ | ==== Operadores Aritméticos ==== | ||
+ | Se puede hacer uso de los típicos operadores aritméticos: | ||
+ | * suma + | ||
+ | * resta - | ||
+ | * multiplicación * | ||
+ | * division /<code sql> | ||
+ | SELECT tb FROM TiposBasicos tb WHERE (((inte+1)*4)-10)/ | ||
+ | </ | ||
+ | ==== Funciones de agregación ==== | ||
+ | Las funciones de agregación que soporta HQL son: | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | SELECT AVG(c.horas), | ||
+ | </ | ||
+ | ==== Funciones sobre escalares ==== | ||
+ | Algunas de las funciones que soporta HQL sobre datos escalares son: | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * Operador "'' | ||
+ | SELECT p.nombre || ' ' || p.ape1 || ' ' || p.ape2 FROM Profesor p WHERE Id=1001 | ||
+ | </ | ||
+ | ===== Ordenación ===== | ||
+ | Como en SQL también es posible ordenar los resultados usando '' | ||
+ | |||
+ | <code sql> | ||
+ | SELECT p FROM Profesor p ORDER BY nombre ASC,ape1 DESC | ||
+ | </ | ||
+ | |||
+ | Las palabras '' | ||
+ | |||
+ | <note important> | ||
+ | El uso de funciones escalares y funciones de agrupamiento en la cláusula '' | ||
+ | </ | ||
+ | <note important> | ||
+ | No se permite el uso de expresiones aritméticas en la cláusula | ||
+ | </ | ||
+ | ===== Agrupaciones ===== | ||
+ | Al igual que en SQL se pueden realizar agrupaciones mediante las palabras claves '' | ||
+ | |||
+ | <code sql|Los nombres de profesores que se repiten mas de una vez> | ||
+ | SELECT nombre, | ||
+ | </ | ||
+ | |||
+ | <note important> | ||
+ | El uso de funciones escalares y funciones de agrupamiento en la cláusula '' | ||
+ | </ | ||
+ | <note important> | ||
+ | No se permite el uso de expresiones aritméticas en la cláusula | ||
+ | </ | ||
+ | ===== Subconsultas ===== | ||
+ | HQL también soporta subconsultas como en SQL. | ||
+ | |||
+ | <code sql|Ciclos que duran más horas que la media de duración de todos los ciclos> | ||
+ | SELECT c.nombre, | ||
+ | </ |