Вы находитесь на странице: 1из 53

Consultas en JPA-QL

Sistemas de Persistencia de
Objetos
Contenidos

nov-08 Alberto MFA alb@uniovi.es 2


Preparación y ejecución

nov-08 Alberto MFA alb@uniovi.es 3


Creación
 HQL y JPA QL

 QBC y QBE (Query By Criteria)

 SQL Directo

nov-08 Alberto MFA alb@uniovi.es 4


Paginación

Número máximo de filas a


El primer resultado es el 0 recuperar desde la fijada por
setFirstResult()

Ejecuta la consulta y
Las Query permiten devuelve una List()
encadenamiento de de objetos User
métodos

nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 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 alb@uniovi.es 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 alb@uniovi.es 8


Ajustes de rendimiento

nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 10
Hints: ejemplos

nov-08 Alberto MFA alb@uniovi.es 11


Ejecución
 Se produce al invocar a:
 getResultList()
Excepción si más
 getSingleResult() de uno o ninguno

Así ya no… pero puede


no haber ninguno

nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 13


nov-08 Alberto MFA alb@uniovi.es 14
Consultas básicas

nov-08 Alberto MFA alb@uniovi.es 15


Partes de una consulta
 Selección
 Fuente de datos  FROM
 Una sola o combinación de ellas
 Restricción
 Filtrado de filas  WHERE
 Proyección
 Selección de partes de las filas que pasan
el filtro  SELECT
nov-08 Alberto MFA alb@uniovi.es 16
Partes de una consulta
FROM WHERE SELECT

Resultados
Tabla
Criterios de Puede que haya
selección de filas menos filas
(WHERE) y puede
que menos campos
(SELECT)
Curso 2005-2006 SID2-GAP 17
Selección (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 polimórficas ¡Sube toda la BDD!
 select b from BillingDetail b
 select o from java.lang.Object o
 select s from java.io.Serializable s
También
polimorfismo sobre
nov-08 Alberto MFA alb@uniovi.es 18
interfaces
Restricción (WHERE)
 WHERE para filtrar filas

nov-08 Alberto MFA alb@uniovi.es 19


Restricción (WHERE)

nov-08 Alberto MFA alb@uniovi.es 20


Operadores de comparación y
precedencia

+
nov-08 Alberto MFA alb@uniovi.es 21
Restricciones sobre
colecciones (WHERE)
 En el WHERE
 Se pueden complementar con funciones

nov-08 Alberto MFA alb@uniovi.es 22


JPA

Funciones

Hibernate

nov-08 Alberto MFA alb@uniovi.es 23


Ordenación
 De la forma usual

nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 25


Proyección de escalares

En la select pueden ir
atributos de clases…

… y resultados de funciones
(las ya vistas)

nov-08 Alberto MFA alb@uniovi.es 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 Bids
nov-08 Alberto MFA alb@uniovi.es 28
Joins implícitos en
asociaciones
 Cuando se accede a propiedades a lo
largo de un camino (path)

Item join User Acceso a propiedad


Bid join Item

También se puede usar en select


nov-08 Alberto MFA alb@uniovi.es 29
Joins implícitos
 Solo se permiten en caminos (path) que
pasen a través de asociaciones many-
to-one o one-to-one
 El final del camino NO puede ser
multivaluado
 P.e. item.bids.amount es ilegal

nov-08 Alberto MFA alb@uniovi.es 30


Joins implícitos en SQL

nov-08 Alberto MFA alb@uniovi.es 31


Joins en FROM
 Cuando el camino de asociaciones
resulta en un conjunto

many-to-many

one-to-many

nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 33


Join explícito en SQL

nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 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 alb@uniovi.es 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

Nota: JPA por defecto carga eager


Si no pone left también carga asociaciones …-to-one, es útil si
de forma agresiva item y hay mapeo fetch=LAZY y se quiere
bidder pero solo los bids que forzar
tienen item y bidder
nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 38


Fetch join recovecos


 Se pueden cargar
duplicados, para evitarlos …

No se puede usar
un alias en SELECT
ni WHERE

nov-08 Alberto MFA alb@uniovi.es 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 alb@uniovi.es 40


Comparación de
identificadores

equivalentes

Diferencia: la primera no carga Item,


la segunda sí

nov-08 Alberto MFA alb@uniovi.es 41


Comparación de id en
ejecución

nov-08 Alberto MFA alb@uniovi.es 42


Consultas de agregados

nov-08 Alberto MFA alb@uniovi.es 43


Funciones en SELECT
count() min() max() sum() avg()

nov-08 Alberto MFA alb@uniovi.es 44


Consulta de totales
GROUP BY

Formación de
+ grupos

Tabla
Criterios de
selección de filas
Funciones de Cálculos sobre
agregados 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 alb@uniovi.es 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 alb@uniovi.es 47


Instanciación dinámica en
SELECT

 Cada fila devuelve un


Las consultas que no objeto de la clase que se
devuelven entidades
pueden tener rendimiento especifica
al no meter resultados en
contexto de persistencia  La clase debe existir y no
necesita estar mapeada
nov-08 Alberto MFA alb@uniovi.es 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
 MySQL en versiones anteriores a 4.?? no
tiene subselects

nov-08 Alberto MFA alb@uniovi.es 49


Subselects
Correlada: puede tener peor
rendimiento

No correlada: no tiene
impacto de rendimiento
Siempre entre
paréntesis

nov-08 Alberto MFA alb@uniovi.es 50


Cuantificación
 Una subselect puede devolver una sola
fila (normalmente agregados) o varias
 En el caso de varias se usan con
cuantificación
 ALL, ANY (o SOME), IN

nov-08 Alberto MFA alb@uniovi.es 51


Cuantificación ejemplos

nov-08 Alberto MFA alb@uniovi.es 52


Funciones con subselect
implícitas

nov-08 Alberto MFA alb@uniovi.es 53

Вам также может понравиться