Professional Documents
Culture Documents
ElHibernateQueryLanguaje(HQL)esellenguajedeconsultasqueusaHibernateparaobtenerlosobjetos
desdelabasededatos.Suprincipalparticularidadesquelasconsultasserealizansobrelosobjetosjava
que forman nuestro modelo de negocio, es decir, las entidades que se persisten en Hibernate. sto hace
queHQLtengalassiguientescaractersticas:
LostiposdedatossonlosdeJava.
LasconsultassonindependientesdellenguajedeSQLespecficodelabasededatos
Lasconsultassonindependientesdelmodelodetablasdelabasededatos.
EsposibletratarconlascoleccionesdeJava.
Esposiblenavegarentrelosdistintosobjetosenlapropiaconsulta.
Vuelvoainsistirsobrealapartadoanterior.EnHibernatelasconsultasHQLselanzan(oseejecutan)sobre
elmodelodeentidadesquehemosdefinidoenHibernate,estoes,sobrenuestrasclasesdenegocio.
De forma poco ortodoxa se podra ver cmo que nuestro modelodetablas en HQL son las clases Java y
NO las tablas de la base de datos. Es decir que cuando hagamos SELECT columna FROM
nombreTabla , el nombreTabla ser una clase Java y columna ser una propiedad Java de dicha
claseynuncaunatabladelabasededatosniunacolumnadeunatabla.
Modelo
En los ejemplos que vamos a realizar van a usarse las siguientes clases Java y tablas, que slo
mostraremos en formato UML. No vamos a poner el cdigo fuente ni los ficheros de hibernate de mapeo
yaqueannohansidoexplicadastodaslacaractersticasqueusanenleccionesanteriores.
ModelodeJava
ElmodelodeclasesJavaeselsiguiente:
ModelodeTablas
Elmodelodetablaseselsiguiente:
PodemosvercmohayunpardediferenciasentreelmodeloenJavayelmodelodetablas.
ParalaclaseCiclosutablasellamaCicloFormativo
EnlaclaseCiclosupropiedadnombresealmacenaenlacolumnallamadanombreCiclo
VeamosahoraunsencilloejemplodeconsultaenHQL
SELECTcFROMCiclocORDERBYnombre
QudiferenciaspodemosverentreHQLySQL?
CiclohacereferenciaalaclaseJavaejemplo02.CicloyNOalatablaCicloFormativo.Ntese
quelaclaseJavaylatablatienendistintonombre.
EsnecesariodefinirelaliascdelaclaseJavaCiclo.
TraslapalabraSELECTseusaelaliasenvezdel*.
Al ordenar los objetos se usa la propiedad nombre de la clase Ciclo en vez de la columna
nombreCiclodelatablaCicloFormativo.
RecuerdaincluirelaliasenlaconsultaHQL.Sinosehaceysedejalaconsultadelasiguienteforma:
SELECTCicloFROMCiclo
seproducirlasiguienteexcepcin:
java.lang.NullPointerException
Hibernatesoportanoincluirlapartedel SELECTenlaconsultaHQL,quedandoentonceslaconsultadela
siguienteforma:
FROMCiclo
1)
2)
portabilidadencasodeusarellenguajedeconsultasdeJPA .
SehahechomencindeestacaractersticayaqueenmuchostutorialesqueseencuentranporInternetse
haceusodeella.
Mayusculas
Respecto a la sensibilidad de las maysculas y minsculas , el lenguaje HQL s que lo es, pero con
matices.
LaspalabrasclavedellenguajeNOsonsensiblesalasmaysculasominsculas.
Lassiguientes2consultassonequivalentes.
selectcount(*)fromCiclo
SELECTCOUNT(*)FROMCiclo
ElnombredelasclasesJavaysuspropiedadesSIsonsensiblesalasmaysculasominsculas.
LasiguienteconsultaHQLescorrecta
SELECTc.nombreFROMCiclocWHEREnombre='DesarrollodeaplicacionesWeb'
LasiguienteconsultaHQLeserrneayaquelapropiedadnombreestescritaconlaNen
maysculas.
SELECTc.NombreFROMCiclocWHERENombre='DesarrollodeaplicacionesWeb'
LasiguienteconsultaHQLeserrneayaqueelnombredelaclaseJava Cicloestescrita
conlacenminsculas.
SELECTc.nombreFROMciclocWHEREnombre='DesarrollodeaplicacionesWeb'
Al realizar comparaciones con los valores de las propiedades, stas NO son sensibles a las
maysculasominsculas.
Lassiguientes2consultasretornanlosmismosobjetos
SELECTc.nombreFROMCiclocWHEREnombre='DesarrollodeaplicacionesWeb'
SELECTc.nombreFROMCiclocWHEREnombre='DESARROLLODEAPLICACIONESWEB'
Filtrando
AligualqueenSQLenHQLtambinpodemosfiltrarlosresultadosmediantelaclusula WHERE.Laforma
deusarlaesmuyparecidaaSQL.
SELECTpFROMProfesorpWHEREnombre='ISABEL'ANDape1<>'ORELLANA'
Aligualqueconelnombredelaclase,elnombredeloscamposdel WHEREsiemprehacereferenciaalas
propiedadesJavaynuncaalosnombresdelascolumnas.Deesaformaseguimosindependizandonuestro
cdigoJavadelaestructuradelabasededatos.
Literales
Texto
Elcarcterparaindicarunliteraldetextoeslacomillasimplenopudindoseusarladoblecomilla.
SELECTpFROMProfesorpWHEREnombre='juan'
Sisequiereusarlacomilladentrodeunliteraldeberemosduplicarla.
SELECTpFROMProfesorpWHEREape1='perezl''andreu'
Integer
Paraincluirunnmerodeltipointegersimplementeseescribedichonmero.
SELECTtbFROMTiposBasicostbWHEREinte=4
Long
ParaincluirunnmerodeltipolongseescribedichonmeroyseaadeunaLmaysculaalfinal.
SELECTtbFROMTiposBasicostbWHERElong1=4L
double
Pararepresentarun doubleseescribeelnmerosepararandolapartedecimalconunpuntoosepuede
usarlanotacincientfica.
SELECTtbFROMTiposBasicostbWHEREdouble1=1.45
SELECTtbFROMTiposBasicostbWHEREdouble1=1.7976931348623157E308
float
Para representar un float se escribe el nmero separarando la parte decimal con un punto o se puede
usarlanotacincientficaperoseleaadeelcarcterFenmaysculaalfinal.
SELECTtbFROMTiposBasicostbWHEREfloat1=1.45F
SELECTtbFROMTiposBasicostbWHEREfloat1=3.4028235E38F
Fecha
Paraindicarunafechalaincluiremosentrecomillassimplesconelformatoyyyymmdd
SELECTtbFROMTiposBasicostbWHEREdateDate='20120725'
Hora
Paraindicarunahoralaincluiremosentrecomillassimplesconelformatohh:mm:ss
SELECTtbFROMTiposBasicostbWHEREdateTime='02:05:10'
Fechayhora
Para indicar una fecha y hora la incluiremos entre comillas simples con el formato
hh:mm:ss.millis,siendooptativoselltimopuntoylosmilisegundos.
yyyymmdd
SELECTtbFROMTiposBasicostbWHEREdateTime='2012072502:05:10'
Operadoresdecomparacin
ParacompararlosdatosenunaexpresinsepuedenusarlassiguientesOperadores:
Signo igual =: La expresin ser verdadera si los dos datos son iguales. En caso de comparar
texto,lacomparacinnoessensibleamaysculasominsculas.
Signomayorque>:Laexpresinserverdaderasieldatodelaizquierdaesmayorqueeldela
derecha.
Signomayorque>=:Laexpresinserverdaderasieldatodelaizquierdaesmayoroigualque
eldeladerecha.
Signomayorque<:Laexpresinserverdaderasieldatodelaizquierdaesmenorqueeldela
derecha.
Signomayorque<=:Laexpresinserverdaderasieldatodelaizquierdaesmenoroigualque
eldeladerecha.
Signo desigual <>: La expresin ser verdadera si el dato de la izquierda es distinto al de la
derecha.
Signo desigual !=: La expresin ser verdadera si el dato de la izquierda es distinto al de la
derecha.
Operadorbetween:Laexpresinserverdaderasieldatodelaizquierdaestdentrodelrango
deladerecha.
SELECTtbFROMTiposBasicostbWHEREinteBETWEEN1AND10
Operadorlike:Laexpresinserverdaderasieldatodelaizquierdacoincideconelpatrnde
laderecha.SeutilizanlosmismossignosqueenSQL%y_.
SELECTtbFROMTiposBasicostbWHEREstriLIKE'H_la%'
Operadornot:Niegaelresultadodeunaexpresin.
expresinisnull:Compruebasieldatodelaizquierdaesnull.
SELECTtbFROMTiposBasicostbWHEREdataDateISNULL
OperadoresLgicos
SepuedehacerusodelostpicosoperadoreslgicoscomoenSQL:
AND
OR
NOT
SELECTpFROMProfesorpWHEREnombre='ANTONIO'AND(ape1='LARA'ORape2='RUBIO')
OperadoresAritmticos
Sepuedehacerusodelostpicosoperadoresaritmticos:
suma+
resta
multiplicacin*
division/
SELECTtbFROMTiposBasicostbWHERE(((inte+1)*4)10)/2=1
Funcionesdeagregacin
LasfuncionesdeagregacinquesoportaHQLson:
AVG():Calculaelvalormediodetodoslosdatos.
SUM():Calculalasumadetodoslosdatos.
MIN():Calculaelvalormnimodetodoslosdatos.
MAX():Calculaelvalormximodetodoslosdatos.
COUNT():Cuantaelndedatos.
SELECTAVG(c.horas),SUM(c.horas),MIN(c.horas),MAX(c.horas),COUNT(*)FROMCicloc
Funcionessobreescalares
AlgunasdelasfuncionesquesoportaHQLsobredatosescalaresson:
UPPER(s):Transformauntextoamaysculas.
LOWER(s):Transformauntextoaminsculas.
CONCAT(s1,s2):Concatenadostextos
TRIM(s):Eliminalosespacioinicialesyfinalesdeuntexto.
SUBSTRING(s,offset,length):Retornaunsubstringdeuntexto.El offsetempiezaacontar
desde1ynodesde0.
LENGTH(s):Calculalalongituddeuntexto.
ABS(n):Calculaelvalorabsolutodeunnmero.
SQRT(n):Calculalarazcuadradadelnmero
Operador||:Permiteconcatenartexto.
SELECTp.nombre||''||p.ape1||''||p.ape2FROMProfesorpWHEREId=1001
Ordenacin
ComoenSQLtambinesposibleordenarlosresultadosusando ORDERBY.Sufuncionamientoescomoen
SQL.
SELECTpFROMProfesorpORDERBYnombreASC,ape1DESC
LaspalabrasASCyDESCsonopcionalesaligualqueenSQL.
Elusodefuncionesescalaresyfuncionesdeagrupamientoenlaclusula ORDERBYsloessoportadopor
HibernatesiessoportadoporellenguajedeSQLdelabasededatossobrelaqueseestejecutando.
NosepermiteelusodeexpresionesaritmticasenlaclusulaORDERBY.
Agrupaciones
AligualqueenSQLsepuedenrealizaragrupacionesmediantelaspalabrasclavesGROUPBYyHAVING
SELECTnombre,count(nombre)FROMProfesorpGROUPBYnombreHAVINGcount(nombre)>1ORDERBYcount(nombre)
Losnombresdeprofesoresqueserepitenmasdeunavez
El uso de funciones escalares y funciones de agrupamiento en la clusula HAVING slo es soportado por
HibernatesiessoportadoporellenguajedeSQLdelabasededatossobrelaqueseestejecutando.
NosepermiteelusodeexpresionesaritmticasenlaclusulaGROUPBY.
Subconsultas
HQLtambinsoportasubconsultascomoenSQL.
SELECTc.nombre,c.horasFROMCiclocWHEREc.horas>(SELECTAVG(c2.horas)FROMCicloc2)
Ciclosqueduranmshorasquelamediadeduracindetodoslosciclos
1)
US/html/ch11.html#d5e2579]
2)
LlamadoJavaPersistenceQueryLanguage(JPQL)
unidades/05_hibernate_query_language/02_hql.txtltimamodificacin:2016/07/0320:35(editorexterno)