Consultas en JPA-QL Sistemas de Persistencia de Objetos
Contenidos
nov-08
Alberto MFA
[email protected]
2
Preparación y ejecución
nov-08
Alberto MFA
[email protected]
3
Creación
HQL y JPA QL
QBC y QBE
SQL Directo
nov-08
(Query By Criteria)
Alberto MFA
[email protected]
4
Paginación
El primer resultado es el 0
Las Query permiten encadenamiento de métodos
nov-08
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 nov-08
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)
nov-08
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 nov-08
Alberto MFA
[email protected]
8
Ajustes de rendimiento
nov-08
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
nov-08
Alberto MFA
[email protected]
10
Hints: ejemplos
nov-08
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
nov-08
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
nov-08
Alberto MFA
[email protected]
13
nov-08
Alberto MFA
[email protected]
14
Consultas básicas
nov-08
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
nov-08
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
nov-08
¡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
nov-08
Alberto MFA
[email protected]
19
Restricción (WHERE)
nov-08
Alberto MFA
[email protected]
20
Operadores de comparación y precedencia _
+ nov-08
Alberto MFA
[email protected]
21
Restricciones sobre colecciones (WHERE)
En el WHERE Se pueden complementar con funciones
nov-08
Alberto MFA
[email protected]
22
JPA
Funciones Hibernate
nov-08
Alberto MFA
[email protected]
23
Ordenación
De la forma usual
nov-08
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)
nov-08
Alberto MFA
[email protected]
25
Proyección de escalares
En la select pueden ir atributos de clases… … y resultados de funciones (las ya vistas)
nov-08
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 nov-08 tienen 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 nov-08
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
nov-08
P.e. item.bids.amount es ilegal
Alberto MFA
[email protected]
30
Joins implícitos en SQL
nov-08
Alberto MFA
[email protected]
31
Joins en FROM
Cuando el camino de asociaciones resulta en un conjunto
many-to-many one-to-many
nov-08
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
nov-08
Alberto MFA
[email protected]
33
Join explícito en SQL
nov-08
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
nov-08
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. nov-08
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 nov-08
Nota: JPA por defecto carga eager asociaciones …-to-one, es útil si hay mapeo fetch=LAZY y se quiere forzar Alberto MFA
[email protected]
37
Fetch join: recovecos
No se puede usar un alias en SELECT ni WHERE No se puede 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
nov-08
Alberto MFA
[email protected]
38
Fetch join recovecos
Se pueden cargar duplicados, para evitarlos …
No se puede usar un alias en SELECT ni WHERE
nov-08
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
nov-08
Alberto MFA
[email protected]
40
Comparación de identificadores equivalentes
Diferencia: la primera no carga Item, la segunda sí nov-08
Alberto MFA
[email protected]
41
Comparación de id en ejecución
nov-08
Alberto MFA
[email protected]
42
Consultas de agregados
nov-08
Alberto MFA
[email protected]
43
Funciones en SELECT count() min() max() sum() avg()
nov-08
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 Selección de grupos Resultados 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
nov-08
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
nov-08
Alberto MFA
[email protected]
47
Instanciación dinámica en SELECT
Las consultas que no devuelven entidades pueden tener rendimiento al no meter resultados en contexto de persistencia
nov-08
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
nov-08
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 nov-08
Alberto MFA
[email protected]
50
Cuantificación
Una subselect puede devolver una sola fila (normalmente agregados) o varias En el caso de varias se usan con cuantificación
nov-08
ALL, ANY (o SOME), IN
Alberto MFA
[email protected]
51
Cuantificación ejemplos
nov-08
Alberto MFA
[email protected]
52
Funciones con subselect implícitas
nov-08
Alberto MFA
[email protected]
53