Consultas JPA-QL

Anuncio
Consultas en JPA-QL
Sistemas de Persistencia de
Objetos
Contenidos
ene-09
Alberto MFA [email protected]
2
Preparación y ejecución
ene-09
Alberto MFA [email protected]
3
Creación
HQL y JPA QL
QBC y QBE
SQL Directo
ene-09
(Query By Criteria)
Alberto MFA [email protected]
4
Paginación
El primer resultado es el 0
Las Query permiten
encadenamiento de
métodos
ene-09
Número máximo de filas a
recuperar desde la fijada por
setFirstResult()
Ejecuta la consulta y
devuelve una List()
de objetos User
Alberto MFA [email protected]
5
Enlace de parámetros
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 parámetros
Enlace nominal (recomendado)
setParameter() sobrecargado para
java.util.Date, java.util.Calendar y
Object (ver documentación)
ene-09
Alberto MFA [email protected]
7
Enlace de parámetros
Enlace posicional
El orden de parámetros
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
Alberto MFA [email protected]
9
Ajustes de rendimiento
Los “hints” son todos dependientes de
implementación, no estándar JPA
Si un hint no es soportado es ignorado
silenciosamente
ene-09
Alberto MFA [email protected]
10
Hints: ejemplos
ene-09
Alberto MFA [email protected]
11
Ejecución
Se produce al invocar a:
getResultList()
getSingleResult()
Excepción si más
de uno o ninguno
Así ya no… pero puede
no haber ninguno
ene-09
Alberto MFA [email protected]
12
Consultas con nombre
Se carga el string de la consulta desde
mapeos
createNamedQuery(…)
Query con anotaciones o en orm.xml
ene-09
Alberto MFA [email protected]
13
ene-09
Alberto MFA [email protected]
14
Consultas básicas
ene-09
Alberto MFA [email protected]
15
Partes de una consulta
Selección
Restricción
Fuente de datos FROM
Una sola o combinación de ellas
Filtrado de filas WHERE
Proyección
ene-09
Selección de partes de las filas que pasan
el filtro SELECT
Alberto MFA [email protected]
16
Partes de una consulta
FROM
WHERE
Resultados
Tabla
Criterios de
selección de filas
Curso 2005-2006
SELECT
SID2-GAP
Puede que haya
menos filas
(WHERE) y puede
que menos campos
(SELECT)
17
Selección (FROM)
SELECT en JPA QL, no necesario en HQL
Alias necesarios para condiciones sobre
miembros
select i from Item i
select i from Item as i
select i from Item i
Las consultas son polimórficas
ene-09
¡Sube toda la BDD!
select b from BillingDetail b
select o from java.lang.Object o
select s from java.io.Serializable s
Alberto MFA [email protected]
También
polimorfismo sobre
18
interfaces
Restricción (WHERE)
WHERE para filtrar filas
ene-09
Alberto MFA [email protected]
19
Restricción (WHERE)
ene-09
Alberto MFA [email protected]
20
Operadores de comparación y
precedencia
_
+
ene-09
Alberto MFA [email protected]
21
Restricciones sobre
colecciones (WHERE)
En el WHERE
Se pueden complementar con funciones
ene-09
Alberto MFA [email protected]
22
JPA
Funciones
Hibernate
ene-09
Alberto MFA [email protected]
23
Ordenación
De la forma usual
ene-09
Alberto MFA [email protected]
24
Proyección
(Esta consulta es inútil ya
que da un producto
cartesiano)
Cada fila es un vector de los
elementos proyectados (Item y Bid)
ene-09
Alberto MFA [email protected]
25
Proyección de escalares
En la select pueden ir
atributos de clases…
… y resultados de funciones
(las ya vistas)
ene-09
Alberto MFA [email protected]
26
Consulta sobre varias tablas
+
Tabla
Criterios de filtrado
de filas
Resultados
Combinación 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
Alberto MFA [email protected]
28
Joins implícitos en
asociaciones
Cuando se accede a propiedades a lo
largo de un camino (path)
Bid join Item
Item join User
Acceso a propiedad
También se puede usar en select
ene-09
Alberto MFA [email protected]
29
Joins implícitos
Solo se permiten en caminos (path) que
pasen a través 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 implícitos traducidos a
SQL
ene-09
Alberto MFA [email protected]
31
Joins en FROM
Cuando el camino de asociaciones
resulta en un conjunto
many-to-many
one-to-many
ene-09
Alberto MFA [email protected]
32
Joins en FROM
También left y right join
Los Item %name% y sus
Bids aunque haya Item
que no tienen Bids
ene-09
Alberto MFA [email protected]
33
Join explícito traducído a SQL
ene-09
Alberto MFA [email protected]
34
Fetch join en FROM
Salvo mapeo en contra todas las colecciones
se cargan lazy
La configuración 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 colección 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 restricción 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
También se puede usar para cargar de
forma agresiva el extremo one de
asociaciones one-to-one y many-to-one
many-to-one
Si no pone left también carga
de forma agresiva item y
bidder pero solo los bids que
tienen item
y bidder
ene-09
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
Fetch join: recovecos
No se puede usar un alias en SELECT ni
WHERE
No se debe hacer fetch join más de una
colección (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
Alberto MFA [email protected]
39
Theta-style en WHERE
El ajuste del join se hace en el WHERE
Es práctico para consultas sobre clases
no asociadas
Da pares
ene-09
Alberto MFA [email protected]
40
Comparación de
identificadores
equivalentes
Diferencia: la primera no carga Item,
la segunda sí
ene-09
Alberto MFA [email protected]
41
Comparación de id en
ejecución
ene-09
Alberto MFA [email protected]
42
Consultas de agregados
ene-09
Alberto MFA [email protected]
43
Funciones en SELECT
count() min() max() sum() avg()
ene-09
Alberto MFA [email protected]
44
Consulta de totales
GROUP BY
Formación de
grupos
+
Tabla
Criterios de
selección de filas
Funciones de
agregados
Cálculos sobre
los grupos
Tabla
Grupos
resultado
Selección de
grupos
HAVING
Curso 2005-2006
SID2-GAP
45
Agrupamiento
Cláusula GROUP BY (como en SQL)
Como en SQL cualquier
propiedad o alias que
aparezca en SELECT
fuera de una función de
agregado debe aparecer
también en la cláusula
GROUP BY
ene-09
Alberto MFA [email protected]
46
Restricción de grupos con
HAVING
Mismas reglas que en SQL
Solo puede aparecer en
HAVING una función de
agregado o una propiedad (o
alias) usado en GROUP BY
ene-09
Alberto MFA [email protected]
47
Instanciación dinámica en
SELECT
Las consultas que no
devuelven entidades
pueden tener más
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 sólo puede ir en el WHERE
Las debe soportar la BDD
ene-09
MySQL en versiones anteriores a 4.?? no
tiene subselects
Alberto MFA [email protected]
49
Subselects
Correlada: puede tener peor
rendimiento
No correlada: no tiene
impacto de rendimiento
Siempre entre
paréntesis
ene-09
Alberto MFA [email protected]
50
Cuantificación
Una subselect puede devolver una sola
fila (normalmente resultado de una
función de agregado) o varias
En el caso de varias se usan con
cuantificación
ene-09
ALL, ANY (o SOME), IN
Alberto MFA [email protected]
51
Cuantificación ejemplos
ene-09
Alberto MFA [email protected]
52
Funciones con subselect
implícitas
ene-09
Alberto MFA [email protected]
53
Descargar