Consultas en JPA-QL
Sistemas de Persistencia de Objetos
Contenidos
ene-09
Preparacin y ejecucin
ene-09
Creacin
HQL y JPA QL
QBC y QBE
(Query By Criteria)
SQL Directo
ene-09 Alberto MFA [email protected] 4
Paginacin
El primer resultado es el 0
Nmero mximo de filas a recuperar desde la fijada por setFirstResult() Ejecuta la consulta y devuelve una List() de objetos User
Las Query permiten encadenamiento de mtodos
ene-09
Enlace de parmetros
Lo que no se debe hacer
Qu hay en este string?
Qu pasa si escriben esto en un formulario?
Es el problema de la SQL injection
ene-09 Alberto MFA
[email protected] 6
Enlace de parmetros
Enlace nominal (recomendado)
setParameter() sobrecargado para java.util.Date, java.util.Calendar y Object (ver documentacin)
ene-09
Enlace de parmetros
Enlace posicional
El orden de parmetros no tiene por qu ser secuencial
Ojo! Se empieza en 1 setters sobrecargados
ene-09 Alberto MFA
[email protected] 8
Ajustes de rendimiento
ene-09
Ajustes de rendimiento
Los hints son todos dependientes de implementacin, no estndar JPA Si un hint no es soportado es ignorado silenciosamente
ene-09 Alberto MFA [email protected] 10
Hints: ejemplos
ene-09
11
Ejecucin
Se produce al invocar a:
getResultList() getSingleResult()
Excepcin si ms de uno o ninguno
As ya no pero puede no haber ninguno
ene-09
12
Consultas con nombre
Se carga el string de la consulta desde mapeos createNamedQuery()
Query con anotaciones o en orm.xml
ene-09
13
ene-09
14
Consultas bsicas
ene-09
15
Partes de una consulta
Seleccin
Fuente de datos FROM Una sola o combinacin de ellas
Restriccin
Filtrado de filas WHERE
Proyeccin
Seleccin de partes de las filas que pasan el filtro SELECT
ene-09 Alberto MFA [email protected] 16
Partes de una consulta
FROM WHERE SELECT
Tabla Criterios de seleccin de filas
Resultados Puede que haya menos filas (WHERE) y puede que menos campos (SELECT)
Curso 2005-2006
SID2-GAP
17
Seleccin (FROM)
SELECT en JPA QL, no necesario en HQL
select i from Item i
Alias necesarios para condiciones sobre miembros
select i from Item as i select i from Item i
Las consultas son polimrficas
Sube toda la BDD!
select b from BillingDetail b select o from java.lang.Object o select s from java.io.Serializable s
ene-09 Alberto MFA
[email protected]Tambin polimorfismo sobre 18 interfaces
Restriccin (WHERE)
WHERE para filtrar filas
ene-09
19
Restriccin (WHERE)
ene-09
20
Operadores de comparacin y precedencia
_
+
ene-09 Alberto MFA [email protected] 21
Restricciones sobre colecciones (WHERE)
En el WHERE Se pueden complementar con funciones
ene-09
22
JPA
Funciones
Hibernate
ene-09
23
Ordenacin
De la forma usual
ene-09
24
Proyeccin
(Esta consulta es intil ya que da un producto cartesiano)
Cada fila es un vector de los elementos proyectados (Item y Bid)
ene-09
25
Proyeccin de escalares
En la select pueden ir atributos de clases y resultados de funciones (las ya vistas)
ene-09
26
Consulta sobre varias tablas
Tabla
+
Criterios de filtrado de filas
Resultados
Combinacin de registros de las dos tablas Tabla
Curso 2005-2006 SID2-GAP 27
Joins: inner, left y right outer
Todos los Items con sus Bids
Los Items que tienen ene-09 Bids
28
Joins implcitos en asociaciones
Cuando se accede a propiedades a lo largo de un camino (path)
Bid join Item
Item join User
Acceso a propiedad
Tambin se puede usar en select
ene-09 Alberto MFA
[email protected] 29
Joins implcitos
Solo se permiten en caminos (path) que pasen a travs de asociaciones manyto-one o one-to-one
El final del camino NO puede ser multivaluado P.e. item.bids.amount es ilegal
Solo en SELECT y WHERE
ene-09 Alberto MFA
[email protected] 30
Joins implcitos traducidos a SQL
ene-09
31
Joins en FROM
Cuando el camino de asociaciones resulta en un conjunto
many-to-many one-to-many
ene-09
32
Joins en FROM
Tambin left y right join
Los Item %name% y sus Bids aunque haya Item que no tienen Bids
ene-09
33
Join explcito traducdo a SQL
ene-09
34
Fetch join en FROM
Salvo mapeo en contra todas las colecciones se cargan lazy La configuracin de mapeo se puede sobrecargar para una consulta concreta si se usa fetch join para colecciones El efecto es que se cargan todos los elementos de la coleccin asociada al momento (eager fetching) Es un ajuste fundamental en el rendimiento de algunas consultas
ene-09 Alberto MFA
[email protected] 35
Fetch join en FROM
Se cargan los Item que pasan la restriccin y sus colecciones asociadas de Bids de forma agresiva (eager), no lazy
El resultado es una List() de Item. Ya no son pares.
ene-09 Alberto MFA
[email protected] 36
Fetch join en FROM
Tambin se puede usar para cargar de forma agresiva el extremo one de asociaciones one-to-one y many-to-one
many-to-one Nota: JPA por defecto carga eager asociaciones -to-one; esto es til si hay mapeo fetch=LAZY y se quiere forzar eager para una consulta
Alberto MFA
[email protected] 37
Si no pone left tambin carga de forma agresiva item y bidder pero solo los bids que tienen item y bidder ene-09
Fetch join: recovecos
No se puede usar un alias en SELECT ni WHERE No se debe hacer fetch join ms de una coleccin (problema del producto cartesiano) La estrategia del mapeo se ignora Se pueden cargar duplicados setMaxResults() y setFirstResult() se desaconsejan
ene-09 Alberto MFA
[email protected] 38
Fetch join recovecos
Se pueden cargar duplicados, para evitarlos No se puede usar un alias en SELECT ni WHERE
ene-09
39
Theta-style en WHERE
El ajuste del join se hace en el WHERE Es prctico para consultas sobre clases no asociadas
Da pares
ene-09
40
Comparacin de identificadores
equivalentes
Diferencia: la primera no carga Item, la segunda s
ene-09 Alberto MFA
[email protected] 41
Comparacin de id en ejecucin
ene-09
42
Consultas de agregados
ene-09
43
Funciones en SELECT
count() min() max() sum() avg()
ene-09
44
Consulta de totales
GROUP BY
+
Tabla
Criterios de seleccin de filas
Formacin de grupos
Funciones de agregados
Clculos sobre los grupos
Tabla Grupos resultado Seleccin de grupos HAVING
Curso 2005-2006 SID2-GAP 45
Agrupamiento
Clusula GROUP BY (como en SQL)
Como en SQL cualquier propiedad o alias que aparezca en SELECT fuera de una funcin de agregado debe aparecer tambin en la clusula GROUP BY
ene-09
46
Restriccin de grupos con HAVING
Mismas reglas que en SQL
Solo puede aparecer en HAVING una funcin de agregado o una propiedad (o alias) usado en GROUP BY
ene-09
47
Instanciacin dinmica en SELECT
Las consultas que no devuelven entidades pueden tener ms rendimiento al no meter resultados en contexto de persistencia
ene-09
Cada fila devuelve un objeto de la clase que se especifica La clase debe existir y no necesita estar mapeada
Alberto MFA [email protected] 48
Subselects
En SQL una subselect puede ir en SELECT, FROM o WHERE En JPA QL slo puede ir en el WHERE Las debe soportar la BDD
MySQL en versiones anteriores a 4.?? no tiene subselects
ene-09
49
Subselects
Correlada: puede tener peor rendimiento
No correlada: no tiene impacto de rendimiento Siempre entre parntesis
ene-09 Alberto MFA
[email protected] 50
Cuantificacin
Una subselect puede devolver una sola fila (normalmente resultado de una funcin de agregado) o varias En el caso de varias se usan con cuantificacin
ALL, ANY (o SOME), IN
ene-09
51
Cuantificacin ejemplos
ene-09
52
Funciones con subselect implcitas
ene-09
53