Anda di halaman 1dari 16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

Anterior

Siguiente

Captulo 15. HQL: El lenguaje de consulta de Hibernate


15.1. Sensibilidad a maysculas 15.2. La clusula from 15.3. Asociaciones y uniones (joins) 15.4. Formas de sintaxis unida 15.5. Referencia a la propiedad identificadora 15.6. La clusula select 15.7. Funciones de agregacin 15.8. Consultas polimrficas 15.9. La clusula where 15.10. Expresiones 15.11. La clusula order by 15.12. La clusula group by 15.13. Subconsultas 15.14. Ejemplos de HQL 15.15. Declaraciones UPDATE y DELETE masivas 15.16. Consejos y Trucos 15.17. Componentes 15.18. Sintaxis del constructor de valores por fila Hibernate utiliza un lenguaje de consulta potente (HQL) que se parece a SQL. Sin embargo, comparado con SQL, HQL es completamente orientado a objetos y comprende nociones como herencia, polimorfismo y asociacin.

15.1. Sensibilidad a maysculas


Las consultas no son sensibles a maysculas, a excepcin de los nombres de las clases y propiedades Java. De modo que SeLeC T es lo mismo que sELEct e igual a SELEC T, pero
org.hibernate.eg.FOO no es lo mismo que org.hibernate.eg.Foo y foo.barSet no es igual a foo.BARSET.

Este manual utiliza palabras clave HQL en minsculas. Algunos usuarios encuentran que las consultas con palabras clave en maysculas son ms fciles de leer, pero esta convencin no es apropiada para las peticiones incluidas en cdigo Java.

15.2. La clusula from


La consulta posible ms simple de Hibernate es de esta manera:
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 1/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

f r o me g . C a t

Esto retorna todas las instancias de la clase eg.C at. Usualmente no es necesario calificar el nombre de la clase ya que auto-import es el valor predeterminado. Por ejemplo:
f r o mC a t

Con el fin de referirse al C at en otras partes de la peticin, necesitar asignar un alias . Por ejemplo:
f r o mC a ta sc a t

Esta consulta asigna el alias cat a las instancias C at, de modo que puede utilizar ese alias luego en la consulta. La palabra clave as es opcional. Tambin podra escribir:
f r o mC a tc a t

Pueden aparecer mltiples clases, lo que causa un producto cartesiano o una unin "cruzada" (cross join).
f r o mF o r m u l a ,P a r a m e t e r f r o mF o r m u l aa sf o r m ,P a r a m e t e ra sp a r a m

Se considera como una buena prctica el nombrar los alias de consulta utilizando una inicial en minsculas, consistente con los estndares de nombrado de Java para las variables locales (por ejemplo, domesticC at).

15.3. Asociaciones y uniones (joins)


Tambin puede asignar alias a entidades asociadas o a elementos de una coleccin de valores utilizando una join. Por ejemplo:
f r o mC a ta sc a t i n n e rj o i nc a t . m a t ea sm a t e l e f to u t e rj o i nc a t . k i t t e n sa sk i t t e n f r o mC a ta sc a tl e f tj o i nc a t . m a t e . k i t t e n sa sk i t t e n s f r o mF o r m u l af o r mf u l lj o i nf o r m . p a r a m e t e rp a r a m

Los tipos de uniones soportadas se tomaron prestados de ANSI SQL


inner join left outer join right outer join full join (no es til usualmente)

Las construcciones inner join, left outer join y right outer join se pueden abreviar.
f r o mC a ta sc a t
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 2/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

j o i nc a t . m a t ea sm a t e l e f tj o i nc a t . k i t t e n sa sk i t t e n

Puede proveer condiciones extras de unin utilizando la palabra clave with de HQL.
f r o mC a ta sc a t l e f tj o i nc a t . k i t t e n sa sk i t t e n w i t hk i t t e n . b o d y W e i g h t >1 0 . 0

A "fetch" join allows associations or collections of values to be initialized along with their parent objects using a single select. This is particularly useful in the case of a collection. It effectively overrides the outer join and lazy declarations of the mapping file for associations and collections. See Seccin 20.1, Estrategias de recuperacin for more information.
f r o mC a ta sc a t i n n e rj o i nf e t c hc a t . m a t e l e f tj o i nf e t c hc a t . k i t t e n s

Usualmente no se necesita asignrsele un alias a una unin de recuperacin ya que los objetos asociados no se deben utilizar en la clusula where (ni en cualquier otra clusula). Los objetos asociados no se retornan directamente en los resultados de la consulta. En cambio, se pueden acceder por medio del objeto padre. La nica razn por la que necesitaramos un alias es si estamos uniendo recursivamente otra coleccin:
f r o mC a ta sc a t i n n e rj o i nf e t c hc a t . m a t e l e f tj o i nf e t c hc a t . k i t t e n sc h i l d l e f tj o i nf e t c hc h i l d . k i t t e n s

La construccin fetch no puede utilizarse en consultas llamadas que usen iterate() (aunque se puede utilizar scroll()). Fetch se debe usar junto con setMaxResults() o setFirstResult() ya que estas operaciones se basan en las filas de resultados, las cuales usualmente contienen duplicados para la recuperacin de coleccin temprana, por lo tanto, el nmero de filas no es lo que se esperara. Fetch no se debe usar junto con una condicin with improvisadas. Es posible crear un producto cartesiano por medio de una recuperacin por union ms de una coleccin en una consulta, as que tenga cuidado en este caso. La recuperacin por unin de mltiples roles de coleccin tambin da resultados a veces inesperados para mapeos de bag, as que tenga cuidado de cmo formular sus consultas en este caso. Finalmente, observe que full join fetch y right join fetch no son significativos. Si est utilizando una recuperacin perezosa a nivel de propiedad (con instrumentacin de cdigo byte), es posible forzar a Hibernate a traer las propiedades perezosas inmediatamente utilizando
fetch all properties. f r o mD o c u m e n tf e t c ha l lp r o p e r t i e so r d e rb yn a m e f r o mD o c u m e n td o cf e t c ha l lp r o p e r t i e sw h e r el o w e r ( d o c . n a m e )l i k e' % c a t s % '

15.4. Formas de sintaxis unida


HQL soporta dos formas de unin de asociacin: implicit y explicit. Las consultas que se mostraron en la seccin anterior todas utilizan la forma explicit, en donde la
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 3/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

palabra clave join se utiliza explcitamente en la clasula from. Esta es la forma recomendada. La forma implicit no utiliza la palabra clave join. Las asociaciones se "desreferencian" utilizando la notacin punto. Uniones implicit pueden aparecer en cualquiera de las clusulas HQL. La unin implicit causa uniones internas (inner joins) en la declaracin SQL que resulta.
f r o mC a ta sc a tw h e r ec a t . m a t e . n a m el i k e' % s % '

15.5. Referencia a la propiedad identificadora


Hay dos maneras de referirse a la propiedad identificadora de una entidad: La propiedad especial (en minsculas) id se puede utilizar para referenciar la propiedad identificadora de una entidad dado que la entidad no defina un id del nombre de la propiedad noidentificadora. Si la entidad define una propiedad identificadora nombrada, puede utilizar ese nombre de propiedad. Las referencias a propiedades identificadoras compuestas siguen las mismas reglas de

nombramiento. Si la entidad no tiene un id del nombre de la propiedad no-identificadora, la propiedad identificadora compuesta slamente puede ser referenciada por su nombre definido. De otra manera se puede utilizar la propiedad id especial para referenciar la propiedad identificadora.

Importante
Observe que esto ha cambiado bastante desde la version 3.2.2. En versiones previas,
idsiempre se refera a la propiedad identificadora sin importar su nombre real. Una

ramificacin de esa decisin fue que las propiedades no-identificadoras nombradas id nunca podran ser referenciadas en consultas de Hibernate.

15.6. La clusula select


La clusula select escoge qu objetos y propiedades devolver en el conjunto de resultados de la consulta. Considere lo siguiente:
s e l e c tm a t e f r o mC a ta sc a t i n n e rj o i nc a t . m a t ea sm a t e

La consulta seleccionar mate s de otros C ats. Puede expresar esta consulta de una manera ms compacta as:
s e l e c tc a t . m a t ef r o mC a tc a t

Las consultas pueden retornar propiedades de cualquier tipo de valor incluyendo propiedades del tipo componente:
s e l e c tc a t . n a m ef r o mD o m e s t i c C a tc a t
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 4/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

w h e r ec a t . n a m el i k e' f r i % ' s e l e c tc u s t . n a m e . f i r s t N a m ef r o mC u s t o m e ra sc u s t

Las consultas pueden retornar mltiples objetos y/o propiedades como un array de tipo Object[],
s e l e c tm o t h e r ,o f f s p r ,m a t e . n a m e f r o mD o m e s t i c C a ta sm o t h e r i n n e rj o i nm o t h e r . m a t ea sm a t e l e f to u t e rj o i nm o t h e r . k i t t e n sa so f f s p r

O como una List:


s e l e c tn e wl i s t ( m o t h e r ,o f f s p r ,m a t e . n a m e ) f r o mD o m e s t i c C a ta sm o t h e r i n n e rj o i nm o t h e r . m a t ea sm a t e l e f to u t e rj o i nm o t h e r . k i t t e n sa so f f s p r

O asumiendo que la clase Family tiene un constructor apropiado - como un objeto Java de tipo seguro:
s e l e c tn e wF a m i l y ( m o t h e r ,m a t e ,o f f s p r ) f r o mD o m e s t i c C a ta sm o t h e r j o i nm o t h e r . m a t ea sm a t e l e f tj o i nm o t h e r . k i t t e n sa so f f s p r

Puede asignar alias para expresiones seleccionadas utilizando as:


s e l e c tm a x ( b o d y W e i g h t )a sm a x ,m i n ( b o d y W e i g h t )a sm i n ,c o u n t ( * )a sn f r o mC a tc a t

Esto es lo ms til cuando se usa junto con select new map:


s e l e c tn e wm a p (m a x ( b o d y W e i g h t )a sm a x ,m i n ( b o d y W e i g h t )a sm i n ,c o u n t ( * )a sn) f r o mC a tc a t

Esta consulta devuelve un Map de alias a valores seleccionados.

15.7. Funciones de agregacin


Las consultas HQL pueden incluso retornar resultados de funciones de agregacin sobre propiedades:
s e l e c ta v g ( c a t . w e i g h t ) ,s u m ( c a t . w e i g h t ) ,m a x ( c a t . w e i g h t ) ,c o u n t ( c a t ) f r o mC a tc a t

Las funciones de agregacin soportadas son:


avg(...), sum(...), min(...), max(...) count(*) count(...), count(distinct ...), count(all...)

Puede utilizar operadores aritmticos, concatenacin y funciones SQL reconocidas en la clusula select:
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 5/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

s e l e c tc a t . w e i g h t+s u m ( k i t t e n . w e i g h t ) f r o mC a tc a t j o i nc a t . k i t t e n sk i t t e n g r o u pb yc a t . i d ,c a t . w e i g h t s e l e c tf i r s t N a m e | | '' | | i n i t i a l | | '' | | u p p e r ( l a s t N a m e )f r o mP e r s o n

Las palabras clave distinct y all se pueden utilizar y tienen las misma semntica que en SQL.
s e l e c td i s t i n c tc a t . n a m ef r o mC a tc a t s e l e c tc o u n t ( d i s t i n c tc a t . n a m e ) ,c o u n t ( c a t )f r o mC a tc a t

15.8. Consultas polimrficas


Una consulta como:
f r o mC a ta sc a t

devuelve instancias no slamente de C at, sino tambin de subclases como DomesticC at. Las consultas de Hibernate pueden nombrar cualquier clase o interfaz Java en la clusula from. La consulta retornar instancias de todas las clases persistentes que extiendan esa clase o implementen la interfaz. La siguiente consulta retornara todos los objetos persistentes.
f r o mj a v a . l a n g . O b j e c to

La interfaz Named se podra implementar por varias clases persistentes:


f r o mN a m e dn ,N a m e dmw h e r en . n a m e=m . n a m e

Las dos ltimas consultas requerirn ms de un SELEC T SQL. Esto significa que la clusula order by no ordenar correctamente todo el conjunto que resulte. Tambin significa que no puede llamar estas consulta usando Query.scroll().

15.9. La clusula where


La clusula where le permite refinar la lista de instancias retornadas. Si no existe ningn alias, puede referirse a las propiedades por nombre:
f r o mC a tw h e r en a m e = ' F r i t z '

Si existe un alias, use un nombre de propiedad calificado:


f r o mC a ta sc a tw h e r ec a t . n a m e = ' F r i t z '

Esto retorna instancias de C at llamadas 'Fritz'. La siguiente peticin:


s e l e c tf o o f r o mF o of o o ,B a rb a r
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 6/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

w h e r ef o o . s t a r t D a t e=b a r . d a t e

retornar todas las instancias de Foo con una instancia de bar con una propiedad date igual a la propiedad startDate del Foo. Las expresiones de ruta compuestas hacen la clusula where extremadamente potente. Tome en consideracin lo siguiente:
f r o mC a tc a tw h e r ec a t . m a t e . n a m ei sn o tn u l l

Esta consulta se traduce a una consulta SQL con una unin de tabla (interna). Por ejemplo:
f r o mF o of o o w h e r ef o o . b a r . b a z . c u s t o m e r . a d d r e s s . c i t yi sn o tn u l l

terminara con una consulta que requerira cuatro uniones de tablas en SQL. El operador = se puede utilizar para comparar no slamente propiedades sino tambin instancias:
f r o mC a tc a t ,C a tr i v a lw h e r ec a t . m a t e=r i v a l . m a t e s e l e c tc a t ,m a t e f r o mC a tc a t ,C a tm a t e w h e r ec a t . m a t e=m a t e

The special property (lowercase) id can be used to reference the unique identifier of an object. See Seccin 15.5, Referencia a la propiedad identificadora for more information.
f r o mC a ta sc a tw h e r ec a t . i d=1 2 3 f r o mC a ta sc a tw h e r ec a t . m a t e . i d=6 9

La segunda consulta es eficiente y no se necesita una unin de tablas. Tambin se pueden utilizar las propiedades de identificadores compuestos. Considere el siguiente ejemplo en donde Person tiene identificadores compuestos que consisten de country y
medicareNumber: f r o mb a n k . P e r s o np e r s o n w h e r ep e r s o n . i d . c o u n t r y=' A U ' a n dp e r s o n . i d . m e d i c a r e N u m b e r=1 2 3 4 5 6 f r o mb a n k . A c c o u n ta c c o u n t w h e r ea c c o u n t . o w n e r . i d . c o u n t r y=' A U ' a n da c c o u n t . o w n e r . i d . m e d i c a r e N u m b e r=1 2 3 4 5 6

Una vez ms, la segunda consulta no requiere una unin de tablas. See Seccin 15.5, Referencia a la propiedad identificadora for more information regarding referencing identifier properties) La propiedad especial class acccede al valor discriminador de una instancia en el caso de persistencia polimrfica. Un nombre de clase Java includo en la clusula where ser traducido a su valor discriminador.
f r o mC a tc a tw h e r ec a t . c l a s s=D o m e s t i c C a t

You can also use components or composite user types, or properties of said component types. See
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 7/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

Seccin 15.17, Componentes for more information. Un tipo "any" tiene las propiedades especiales id y class, permitndole expresar una unin de la siguiente forma (en donde AuditLog.item es una propiedad mapeada con <any>).
f r o mA u d i t L o gl o g ,P a y m e n tp a y m e n t w h e r el o g . i t e m . c l a s s=' P a y m e n t 'a n dl o g . i t e m . i d=p a y m e n t . i d

La log.item.class y payment.class haran referencia a los valores de columnas de la base de datos completamente diferentes en la consulta anterior.

15.10. Expresiones
Las expresiones utilizadas en la clusula where incluyen lo siguiente: operadores matemticos: +, -, *, / operadores de comparacin binarios: =, >=, <=, <>, !=, like operadores lgicos and, or, not Parntesis ( ) que indican agrupacin
in, not in, between, is null, is not null, is empty , is not empty , member of y not member of

Caso "simple", case ... when ... then ... else ... end, y caso "buscado", case when ... then ... else ... end concatenacin de cadenas ...||... o concat(...,...)
current_date(), current_time() y current_timestamp() second(...), minute(...), hour(...), day(...), month(...), and year(...)

Cualquier

funcin

operador

definido

por

EJB-QL

3.0:

substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length(), mod() coalesce() y nullif() str() para convertir valores numricos o temporales a una cadena legible. cast(... as ...), donde el segundo argumento es el nombre de un tipo de Hibernate , y extract(... from ...) si cast() y extract() es soportado por la base de datos subyacente.

la funcin index() de HQL, que se aplica a alias de una coleccin indexada unida. Las funciones de HQL que tomen expresiones de ruta valuadas en colecciones:
size(), minelement(), maxelement(), minindex(), maxindex(), junto con las funciones especiales elements() e indices, las cuales se pueden cuantificar utilizando some, all, exists, any, in.

Cualquier funcin escalar SQL soportada por la base de datos como sign(), trunc(), rtrim() y sin() parmetros posicionales JDBC ? parmetros con nombre :name , :start_date y :x1 literales SQL 'foo', 69, 6.66E+2, '1970-01-01 10:00:01.0' constantes Java public static finaleg.C olor.TABBY
in y between pueden utilizarse as: f r o mD o m e s t i c C a tc a tw h e r ec a t . n a m eb e t w e e n' A 'a n d' B '
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 8/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

f r o mD o m e s t i c C a tc a tw h e r ec a t . n a m ei n(' F o o ' ,' B a r ' ,' B a z ')

Las formas negadas se pueden escribir as:


f r o mD o m e s t i c C a tc a tw h e r ec a t . n a m en o tb e t w e e n' A 'a n d' B ' f r o mD o m e s t i c C a tc a tw h e r ec a t . n a m en o ti n(' F o o ' ,' B a r ' ,' B a z ')

De manera similar, is null y is not null se pueden utilizar para probar valores nulos. Los valores booleanos se pueden utilizar fcilmente en expresiones declarando substituciones de consulta HQL en la configuracin de Hibernate:
< p r o p e r t yn a m e = " h i b e r n a t e . q u e r y . s u b s t i t u t i o n s " > t r u e1 ,f a l s e0 < / p r o p e r t y >

Esto remplazar las palabras clave true y false con los literales 1 y 0 en el SQL traducido de este HQL:
f r o mC a tc a tw h e r ec a t . a l i v e=t r u e

Puede comprobar el tamao de una coleccin con la propiedad especial size o la funcin especial
size(). f r o mC a tc a tw h e r ec a t . k i t t e n s . s i z e >0 f r o mC a tc a tw h e r es i z e ( c a t . k i t t e n s ) >0

Para las colecciones indexadas, puede referirse a los ndices mximo y mnimo utilizando las funciones minindex y maxindex . De manera similar, se puede referir a los elementos mximo y mnimo de una coleccin de tipo bsico utilizando las funciones minelement y maxelement. Por ejemplo:
f r o mC a l e n d a rc a lw h e r em a x e l e m e n t ( c a l . h o l i d a y s ) >c u r r e n t _ d a t e f r o mO r d e ro r d e rw h e r em a x i n d e x ( o r d e r . i t e m s ) >1 0 0 f r o mO r d e ro r d e rw h e r em i n e l e m e n t ( o r d e r . i t e m s ) >1 0 0 0 0

Las funciones SQL any, some, all, exists, in estn soportadas cuando se les pasa el conjunto de elementos o ndices de una coleccin (las funciones elements e indices) o el resultado de una subconsulta (vea a continuacin):
s e l e c tm o t h e rf r o mC a ta sm o t h e r ,C a ta sk i t w h e r ek i ti ne l e m e n t s ( f o o . k i t t e n s ) s e l e c tpf r o mN a m e L i s tl i s t ,P e r s o np w h e r ep . n a m e=s o m ee l e m e n t s ( l i s t . n a m e s ) f r o mC a tc a tw h e r ee x i s t se l e m e n t s ( c a t . k i t t e n s )
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 9/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

f r o mP l a y e rpw h e r e3 >a l le l e m e n t s ( p . s c o r e s ) f r o mS h o ws h o ww h e r e' f i z a r d 'i ni n d i c e s ( s h o w . a c t s )

Note que estas construcciones - size , elements, indices, minindex , maxindex , minelement, maxelement solo se pueden utilizar en la clusula where en Hibernate3. Los elementos de colecciones indexadas (arrays, listas, mapas) se pueden referir por ndice slamente en una clusula where:
f r o mO r d e ro r d e rw h e r eo r d e r . i t e m s [ 0 ] . i d=1 2 3 4 s e l e c tp e r s o nf r o mP e r s o np e r s o n ,C a l e n d a rc a l e n d a r w h e r ec a l e n d a r . h o l i d a y s [ ' n a t i o n a ld a y ' ]=p e r s o n . b i r t h D a y a n dp e r s o n . n a t i o n a l i t y . c a l e n d a r=c a l e n d a r s e l e c ti t e mf r o mI t e mi t e m ,O r d e ro r d e r w h e r eo r d e r . i t e m s [o r d e r . d e l i v e r e d I t e m I n d i c e s [ 0 ]]=i t e ma n do r d e r . i d=1 1 s e l e c ti t e mf r o mI t e mi t e m ,O r d e ro r d e r w h e r eo r d e r . i t e m s [m a x i n d e x ( o r d e r . i t e m s )]=i t e ma n do r d e r . i d=1 1

La expresin dentro de [] puede incluso ser una expresin aritmtica:


s e l e c ti t e mf r o mI t e mi t e m ,O r d e ro r d e r w h e r eo r d e r . i t e m s [s i z e ( o r d e r . i t e m s )-1]=i t e m

HQL tambin proporciona la funcin incorporada index(), para los elementos de una asociacin uno-amuchos o una coleccin de valores.
s e l e c ti t e m ,i n d e x ( i t e m )f r o mO r d e ro r d e r j o i no r d e r . i t e m si t e m w h e r ei n d e x ( i t e m )<5

Se pueden utilizar las funciones SQL escalares soportadas por la base de datos subyacente:
f r o mD o m e s t i c C a tc a tw h e r eu p p e r ( c a t . n a m e )l i k e' F R I % '

Considere qu tan larga y menos leble sera la siguiente consulta en SQL:


s e l e c tc u s t f r o mP r o d u c tp r o d , S t o r es t o r e i n n e rj o i ns t o r e . c u s t o m e r sc u s t w h e r ep r o d . n a m e=' w i d g e t ' a n ds t o r e . l o c a t i o n . n a m ei n(' M e l b o u r n e ' ,' S y d n e y ') a n dp r o d=a l le l e m e n t s ( c u s t . c u r r e n t O r d e r . l i n e I t e m s )

Ayuda: algo como


S E L E C Tc u s t . n a m e ,c u s t . a d d r e s s ,c u s t . p h o n e ,c u s t . i d ,c u s t . c u r r e n t _ o r d e r F R O Mc u s t o m e r sc u s t , s t o r e ss t o r e , l o c a t i o n sl o c , s t o r e _ c u s t o m e r ss c , p r o d u c tp r o d W H E R Ep r o d . n a m e=' w i d g e t '
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 10/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

A N Ds t o r e . l o c _ i d=l o c . i d A N Dl o c . n a m eI N(' M e l b o u r n e ' ,' S y d n e y ') A N Ds c . s t o r e _ i d=s t o r e . i d A N Ds c . c u s t _ i d=c u s t . i d A N Dp r o d . i d=A L L ( S E L E C Ti t e m . p r o d _ i d F R O Ml i n e _ i t e m si t e m ,o r d e r so W H E R Ei t e m . o r d e r _ i d=o . i d A N Dc u s t . c u r r e n t _ o r d e r=o . i d )

15.11. La clusula order by


La lista retornada por una consulta se puede ordenar por cualquier propiedad de una clase retornada o componentes:
f r o mD o m e s t i c C a tc a t o r d e rb yc a t . n a m ea s c ,c a t . w e i g h td e s c ,c a t . b i r t h d a t e

Los asc o desc opcionales indican ordenamiento ascendente o descendente respectivamente.

15.12. La clusula group by


Una consulta que retorna valores agregados se puede agrupar por cualquier propiedad de una clase retornada o componentes:
s e l e c tc a t . c o l o r ,s u m ( c a t . w e i g h t ) ,c o u n t ( c a t ) f r o mC a tc a t g r o u pb yc a t . c o l o r s e l e c tf o o . i d ,a v g ( n a m e ) ,m a x ( n a m e ) f r o mF o of o oj o i nf o o . n a m e sn a m e g r o u pb yf o o . i d

Se permite tambin una clusula having.


s e l e c tc a t . c o l o r ,s u m ( c a t . w e i g h t ) ,c o u n t ( c a t ) f r o mC a tc a t g r o u pb yc a t . c o l o r h a v i n gc a t . c o l o ri n( e g . C o l o r . T A B B Y ,e g . C o l o r . B L A C K )

Las funciones SQL y las funciones de agregacin SQL estn permitidas en las clusulas having y
order by , si estn soportadas por la base de datos subyacente (por ejemplo, no lo estn en MySQL). s e l e c tc a t f r o mC a tc a t j o i nc a t . k i t t e n sk i t t e n g r o u pb yc a t . i d ,c a t . n a m e ,c a t . o t h e r ,c a t . p r o p e r t i e s h a v i n ga v g ( k i t t e n . w e i g h t ) >1 0 0 o r d e rb yc o u n t ( k i t t e n )a s c ,s u m ( k i t t e n . w e i g h t )d e s c

La clusula group by ni la clusula order by pueden contener expresiones aritmticas. Hibernate tampocoo expande una entidad agrupada as que no puede escribir group by cat si todas las propiedades de cat son no-agregadas. Tiene que enumerar todas la propiedades no-agregadas
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 11/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

explcitamente.

15.13. Subconsultas
Para bases de datos que soportan subconsultas, Hibernate soporta subconsultas dentro de consultas. Una subconsulta se debe encerrar entre parntesis (frecuentemente por una llamada a una funcin de agregacin SQL). Incluso se permiten subconsultas correlacionadas (subconsultas que se refieren a un alias en la consulta exterior).
f r o mC a ta sf a t c a t w h e r ef a t c a t . w e i g h t >( s e l e c ta v g ( c a t . w e i g h t )f r o mD o m e s t i c C a tc a t ) f r o mD o m e s t i c C a ta sc a t w h e r ec a t . n a m e=s o m e( s e l e c tn a m e . n i c k N a m ef r o mN a m ea sn a m e ) f r o mC a ta sc a t w h e r en o te x i s t s( f r o mC a ta sm a t ew h e r em a t e . m a t e=c a t ) f r o mD o m e s t i c C a ta sc a t w h e r ec a t . n a m en o ti n( s e l e c tn a m e . n i c k N a m ef r o mN a m ea sn a m e ) s e l e c tc a t . i d ,( s e l e c tm a x ( k i t . w e i g h t )f r o mc a t . k i t t e nk i t ) f r o mC a ta sc a t

Note que las subconsultas HQL pueden ocurrir slamente en las clusulas select o where. Note that subqueries can also utilize row value constructor syntax. See Seccin 15.18, Sintaxis del constructor de valores por fila for more information.

15.14. Ejemplos de HQL


Las consultas de Hibernate pueden ser bastante potentes y complejas. De hecho, el poder del lenguaje de consulta es uno de las fortalezas principales de Hibernate. He aqu algunos ejemplos de consultas muy similares a las consultas de proyectos recientes. Note que la mayora de las consultas que escribir son mucho ms simples que los siguientes ejemplos. La siguiente consulta retorna el order id, nmero de items y valor total mnimo dado y el valor de la orden para todas las rdenes no pagadas de un cliente en particular. Los resultados se ordenan de acuerdo al valor total. Al determinar los precios, usa el catlogo actual. La consulta SQL resultante, contra las tablas ORDER, ORDER_LINE, PRODUC T, C ATALOG y PRIC E tiene cuatro uniones interiores y una subseleccin (no correlacionada).
s e l e c to r d e r . i d ,s u m ( p r i c e . a m o u n t ) ,c o u n t ( i t e m ) f r o mO r d e ra so r d e r j o i no r d e r . l i n e I t e m sa si t e m
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 12/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

j o i ni t e m . p r o d u c ta sp r o d u c t , C a t a l o ga sc a t a l o g j o i nc a t a l o g . p r i c e sa sp r i c e w h e r eo r d e r . p a i d=f a l s e a n do r d e r . c u s t o m e r=: c u s t o m e r a n dp r i c e . p r o d u c t=p r o d u c t a n dc a t a l o g . e f f e c t i v e D a t e<s y s d a t e a n dc a t a l o g . e f f e c t i v e D a t e > =a l l( s e l e c tc a t . e f f e c t i v e D a t e f r o mC a t a l o ga sc a t w h e r ec a t . e f f e c t i v e D a t e<s y s d a t e ) g r o u pb yo r d e r h a v i n gs u m ( p r i c e . a m o u n t ) >: m i n A m o u n t o r d e rb ys u m ( p r i c e . a m o u n t )d e s c

Qu monstruo! Realmente, en la vida real, no me gustan mucho las subconsultas, de modo que mi consulta fue realmente algo como esto:
s e l e c to r d e r . i d ,s u m ( p r i c e . a m o u n t ) ,c o u n t ( i t e m ) f r o mO r d e ra so r d e r j o i no r d e r . l i n e I t e m sa si t e m j o i ni t e m . p r o d u c ta sp r o d u c t , C a t a l o ga sc a t a l o g j o i nc a t a l o g . p r i c e sa sp r i c e w h e r eo r d e r . p a i d=f a l s e a n do r d e r . c u s t o m e r=: c u s t o m e r a n dp r i c e . p r o d u c t=p r o d u c t a n dc a t a l o g=: c u r r e n t C a t a l o g g r o u pb yo r d e r h a v i n gs u m ( p r i c e . a m o u n t ) >: m i n A m o u n t o r d e rb ys u m ( p r i c e . a m o u n t )d e s c

La prxima consulta cuenta el nmero de pagos en cada estado, excluyendo todos los pagos en el estado AWAITING_APPROVAL donde el cambio ms reciente al estado lo hizo el usuario actual. Se traduce en una consulta SQL con dos uniones interiores y una subseleccin correlacionada contra las tablas PAYMENT, PAYMENT_STATUS y PAYMENT_STATUS_C HANGE.
s e l e c tc o u n t ( p a y m e n t ) ,s t a t u s . n a m e f r o mP a y m e n ta sp a y m e n t j o i np a y m e n t . c u r r e n t S t a t u sa ss t a t u s j o i np a y m e n t . s t a t u s C h a n g e sa ss t a t u s C h a n g e w h e r ep a y m e n t . s t a t u s . n a m e< >P a y m e n t S t a t u s . A W A I T I N G _ A P P R O V A L o r( s t a t u s C h a n g e . t i m e S t a m p=( s e l e c tm a x ( c h a n g e . t i m e S t a m p ) f r o mP a y m e n t S t a t u s C h a n g ec h a n g e w h e r ec h a n g e . p a y m e n t=p a y m e n t ) a n ds t a t u s C h a n g e . u s e r< >: c u r r e n t U s e r ) g r o u pb ys t a t u s . n a m e ,s t a t u s . s o r t O r d e r o r d e rb ys t a t u s . s o r t O r d e r

Si la coleccin statusC hanges se mapeara como una lista, en vez de un conjunto, la consulta habra sido mucho ms simple de escribir.
s e l e c tc o u n t ( p a y m e n t ) ,s t a t u s . n a m e f r o mP a y m e n ta sp a y m e n t
docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html 13/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

j o i np a y m e n t . c u r r e n t S t a t u sa ss t a t u s w h e r ep a y m e n t . s t a t u s . n a m e< >P a y m e n t S t a t u s . A W A I T I N G _ A P P R O V A L o rp a y m e n t . s t a t u s C h a n g e s [m a x I n d e x ( p a y m e n t . s t a t u s C h a n g e s )] . u s e r< >: c u r r e n t U s e r g r o u pb ys t a t u s . n a m e ,s t a t u s . s o r t O r d e r o r d e rb ys t a t u s . s o r t O r d e r

La prxima consulta utiliza la funcin isNull() de MS SQL Server para devolver todas las cuentas y pagos an no cancelados de la organizacin a la que pertenece el usuario actual. Se traduce como una consulta SQL con tres uniones interiores, una unin exterior y una subseleccin contra las tablas AC C OUNT, PAYMENT, PAYMENT_STATUS , AC C OUNT_TYPE, ORGANIZATION y ORG_USER .
s e l e c ta c c o u n t ,p a y m e n t f r o mA c c o u n ta sa c c o u n t l e f to u t e rj o i na c c o u n t . p a y m e n t sa sp a y m e n t w h e r e: c u r r e n t U s e ri ne l e m e n t s ( a c c o u n t . h o l d e r . u s e r s ) a n dP a y m e n t S t a t u s . U N P A I D=i s N u l l ( p a y m e n t . c u r r e n t S t a t u s . n a m e ,P a y m e n t S t a t u s . U N P A I D ) o r d e rb ya c c o u n t . t y p e . s o r t O r d e r ,a c c o u n t . a c c o u n t N u m b e r ,p a y m e n t . d u e D a t e

Para algunas bases de datos, necesitaramos eliminar la subseleccin (correlacionada).


s e l e c ta c c o u n t ,p a y m e n t f r o mA c c o u n ta sa c c o u n t j o i na c c o u n t . h o l d e r . u s e r sa su s e r l e f to u t e rj o i na c c o u n t . p a y m e n t sa sp a y m e n t w h e r e: c u r r e n t U s e r=u s e r a n dP a y m e n t S t a t u s . U N P A I D=i s N u l l ( p a y m e n t . c u r r e n t S t a t u s . n a m e ,P a y m e n t S t a t u s . U N P A I D ) o r d e rb ya c c o u n t . t y p e . s o r t O r d e r ,a c c o u n t . a c c o u n t N u m b e r ,p a y m e n t . d u e D a t e

15.15. Declaraciones UPDATE y DELETE masivas


HQL now supports update , delete and insert ... select ... statements. See Seccin 14.4, Operaciones de estilo DML for more information.

15.16. Consejos y Trucos


Puede contar el nmero de resultados de una consulta sin retornarlos:
(( I n t e g e r )s e s s i o n . c r e a t e Q u e r y ( " s e l e c tc o u n t ( * )f r o m. . . . " ) . i t e r a t e ( ) . n e x t ( )) . i n t V a l u e ( )

Para ordenar un resultado por el tamao de una coleccin, utilice la siguiente consulta:
s e l e c tu s r . i d ,u s r . n a m e f r o mU s e ra su s r l e f tj o i nu s r . m e s s a g e sa sm s g g r o u pb yu s r . i d ,u s r . n a m e o r d e rb yc o u n t ( m s g )

Si su base de datos soporta subselecciones, puede colocar una condicin sobre el tamao de seleccin en la clusula where de su consulta:

docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html

14/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

f r o mU s e ru s rw h e r es i z e ( u s r . m e s s a g e s ) > =1

Si su base de datos no soporta subselecciones, utilice la siguiente consulta:


s e l e c tu s r . i d ,u s r . n a m e f r o mU s e ru s r j o i nu s r . m e s s a g e sm s g g r o u pb yu s r . i d ,u s r . n a m e h a v i n gc o u n t ( m s g ) > =1

Como esta solucin no puede retornar un User con cero mensajes debido a la unin interior, la siguiente forma tambin es til:
s e l e c tu s r . i d ,u s r . n a m e f r o mU s e ra su s r l e f tj o i nu s r . m e s s a g e sa sm s g g r o u pb yu s r . i d ,u s r . n a m e h a v i n gc o u n t ( m s g )=0

Las propiedades de un JavaBean pueden ser ligadas a los parmetros de consulta con nombre:
Q u e r yq=s . c r e a t e Q u e r y ( " f r o mf o oF o oa sf o ow h e r ef o o . n a m e = : n a m ea n df o o . s i z e = : s i z e " ) ; q . s e t P r o p e r t i e s ( f o o B e a n ) ;/ /f o o B e a nh a sg e t N a m e ( )a n dg e t S i z e ( ) L i s tf o o s=q . l i s t ( ) ;

Las colecciones son paginables usando la interfaz Query con un filtro:


Q u e r yq=s . c r e a t e F i l t e r (c o l l e c t i o n ," ") ;/ /t h et r i v i a lf i l t e r q . s e t M a x R e s u l t s ( P A G E _ S I Z E ) ; q . s e t F i r s t R e s u l t ( P A G E _ S I Z E*p a g e N u m b e r ) ; L i s tp a g e=q . l i s t ( ) ;

Los elementos de coleccin se pueden ordenar o agrupar usando un filtro de consulta:


C o l l e c t i o no r d e r e d C o l l e c t i o n=s . f i l t e r (c o l l e c t i o n ," o r d e rb yt h i s . a m o u n t ") ; C o l l e c t i o nc o u n t s=s . f i l t e r (c o l l e c t i o n ," s e l e c tt h i s . t y p e ,c o u n t ( t h i s )g r o u pb yt h i s . t y p e "

Puede hallar el tamao de una coleccin sin inicializarla:


(( I n t e g e r )s e s s i o n . c r e a t e Q u e r y ( " s e l e c tc o u n t ( * )f r o m. . . . " ) . i t e r a t e ( ) . n e x t ( )) . i n t V a l u e ( ) ;

15.17. Componentes
Los componentes se pueden utilizar de la misma manera en que se pueden utilizar los tipos de valores simples en consultas HQL. Pueden aparecer en la clusula select as:
s e l e c tp . n a m ef r o mP e r s o np s e l e c tp . n a m e . f i r s tf r o mP e r s o np

docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html

15/16

29/06/13

Captulo 15. HQL: El lenguaje de consulta de Hibernate

en donde el nombre de la Persona es un componente. Los componentes tambin se pueden utilizar en la clusula where :
f r o mP e r s o npw h e r ep . n a m e=: n a m e f r o mP e r s o npw h e r ep . n a m e . f i r s t=: f i r s t N a m e

Los componentes tambin se pueden utilizar en la clusula where :


f r o mP e r s o npo r d e rb yp . n a m e f r o mP e r s o npo r d e rb yp . n a m e . f i r s t

Otro uso comn de los componentes se encuentra en row value constructors.

15.18. Sintaxis del constructor de valores por fila


HQL soporta la utilizacin de la sintaxis row value constructor de SQL ANSI que a veces se denomina sintaxis tuple , aunque puede que la base de datos subyacentes no soporte esa nocin. Aqu estamos refirindonos generalmente a las comparaciones multivaluadas que se asocian tpicamente con los componentes. Considere una entidad Persona, la cual define un componente de nombre:
f r o mP e r s o npw h e r ep . n a m e . f i r s t = ' J o h n 'a n dp . n a m e . l a s t = ' J i n g l e h e i m e r S c h m i d t '

Esa es una sintaxis vlida aunque un poco verbosa. Puede hacerlo un poco ms conciso utilizando la sintaxis row value constructor:
f r o mP e r s o npw h e r ep . n a m e = ( ' J o h n ' ,' J i n g l e h e i m e r S c h m i d t ' )

Tambin puede ser til especificar esto en la clusula select:


s e l e c tp . n a m ef r o mP e r s o np

Tambin puede ser beneficioso el utilizar la sintaxis row value constructor cuando se utilizan subconsultas que necesitan compararse con valores mltiples:
f r o mC a ta sc a t w h e r en o t(c a t . n a m e ,c a t . c o l o r)i n( s e l e c tc a t . n a m e ,c a t . c o l o rf r o mD o m e s t i c C a tc a t )

Algo que se debe tomar en consideracin al decidir si quiere usar esta sintaxis es que la consulta depender del orden de las sub-propiedades componentes en los metadatos. Copyright 2004 Red Hat, Inc. Subir Inicio

Anterior

Siguiente

C aptulo 14. Proce sam ie nto por lote s


docs.jboss.org/hibernate/core/3.5/reference/es-ES/html/queryhql.html

C aptulo 16. C onsultas por crite rios


16/16

Anda mungkin juga menyukai