You are on page 1of 6

HQL

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

pero en la propia documentacin se recomienda no hacerlo

1)

ya que de esa forma se mejora la

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

Operadorin: La expresin ser verdadera si el dato de la izquierda est dentro de la lista de


valoresdeladerecha.
SELECTtbFROMTiposBasicostbWHEREinteIN(1,3,5,7)

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)

Chapter 11. HQL and JPQL. 11.2.1. Select statements [http://docs.jboss.org/hibernate/orm/4.1/devguide/en

US/html/ch11.html#d5e2579]
2)

LlamadoJavaPersistenceQueryLanguage(JPQL)
unidades/05_hibernate_query_language/02_hql.txtltimamodificacin:2016/07/0320:35(editorexterno)