53
Consultas en JPA-QL Sistemas de Persistencia de Objetos

5. JPA QL

Embed Size (px)

Citation preview

Page 1: 5. JPA QL

Consultas en JPA-QL

Sistemas de Persistencia de Objetos

Page 2: 5. JPA QL

Contenidos

nov-08 Alberto MFA [email protected] 2

Page 3: 5. JPA QL

Preparación y ejecución

nov-08 Alberto MFA [email protected] 3

Page 4: 5. JPA QL

Creación

� HQL y JPA QL

nov-08 Alberto MFA [email protected] 4

� QBC y QBE (Query By Criteria)

� SQL Directo

Page 5: 5. JPA QL

Paginación

nov-08 Alberto MFA [email protected] 5

El primer resultado es el 0Número máximo de filas a recuperar desde la fijada por setFirstResult()

Ejecuta la consulta y devuelve una List()de objetos User

Las Query permiten encadenamiento de métodos

Page 6: 5. JPA QL

Enlace de parámetros

¿Qué hay en este string?

� Lo que no se debe hacer

nov-08 Alberto MFA [email protected] 6

¿Qué pasa si escriben esto en un formulario?

Es el problema de la SQL injection

string?

Page 7: 5. JPA QL

Enlace de parámetros

� Enlace nominal (recomendado)

nov-08 Alberto MFA [email protected] 7

setParameter() sobrecargado para java.util.Date, java.util.Calendar y Object (ver documentación)

Page 8: 5. JPA QL

Enlace de parámetros

� Enlace posicional

El orden de parámetros no tiene por qué ser

nov-08 Alberto MFA [email protected] 8

setters sobrecargados

¡Ojo! Se empieza en 1

no tiene por qué ser secuencial

Page 9: 5. JPA QL

Ajustes de rendimiento

nov-08 Alberto MFA [email protected] 9

Page 10: 5. JPA QL

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

Page 11: 5. JPA QL

Hints: ejemplos

nov-08 Alberto MFA [email protected] 11

Page 12: 5. JPA QL

Ejecución

� Se produce al invocar a:� getResultList()

� getSingleResult()Excepción si más de uno o ninguno

nov-08 Alberto MFA [email protected] 12

� getSingleResult() de uno o ninguno

Así ya no… pero puede no haber ninguno

Page 13: 5. JPA QL

Consultas con nombre

� Se carga el string de la consulta desde mapeos

� createNamedQuery (…)

nov-08 Alberto MFA [email protected] 13

� createNamedQuery (…)

� Query con anotaciones o en orm.xml

Page 14: 5. JPA QL

nov-08 Alberto MFA [email protected] 14

Page 15: 5. JPA QL

Consultas básicas

nov-08 Alberto MFA [email protected] 15

Page 16: 5. JPA QL

Partes de una consulta

� Selección� Fuente de datos � FROM

� Una sola o combinación de ellas� 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 [email protected] 16

Page 17: 5. JPA QL

Partes de una consulta

FROM WHERE SELECT

Curso 2005-2006 SID2-GAP 17

Criterios de selección de filas

TablaResultados

Puede que haya menos filas (WHERE) y puede que menos campos (SELECT)

Page 18: 5. JPA QL

Selección (FROM)

� SELECT en JPA QL, no necesario en HQL� select i from Item i

� Alias necesarios para condiciones sobre miembros

nov-08 Alberto MFA [email protected] 18

miembros� select i from Item as i� select i from Item i

� Las consultas son polimórficas� select b from BillingDetail b� select o from java.lang.Object o� select s from java.io.Serializable s

¡Sube toda la BDD!

También polimorfismo sobre interfaces

Page 19: 5. JPA QL

Restricción (WHERE)

� WHERE para filtrar filas

nov-08 Alberto MFA [email protected] 19

Page 20: 5. JPA QL

Restricción (WHERE)

nov-08 Alberto MFA [email protected] 20

Page 21: 5. JPA QL

Operadores de comparación y precedencia

_

nov-08 Alberto MFA [email protected] 21

+

Page 22: 5. JPA QL

Restricciones sobre colecciones (WHERE)

� En el WHERE

� Se pueden complementar con funciones

nov-08 Alberto MFA [email protected] 22

Page 23: 5. JPA QL

Funciones

JPA

Hibernate

nov-08 Alberto MFA [email protected] 23

Page 24: 5. JPA QL

Ordenación

� De la forma usual

nov-08 Alberto MFA [email protected] 24

Page 25: 5. JPA QL

Proyección

(Esta consulta es inútil ya que da un producto cartesiano)

nov-08 Alberto MFA [email protected] 25

Cada fila es un vector de los elementos proyectados (Item y Bid)

Page 26: 5. JPA QL

Proyección de escalares

En la select pueden ir

nov-08 Alberto MFA [email protected] 26

En la select pueden ir atributos de clases…

… y resultados de funciones (las ya vistas)

Page 27: 5. JPA QL

Consulta sobre varias tablas

+

Curso 2005-2006 SID2-GAP 27

Tabla

Resultados

Tabla

+

Combinación de registros de las dos tablas

Criterios de filtrado de filas

Page 28: 5. JPA QL

Joins: inner, left y right outer

nov-08 Alberto MFA [email protected] 28

Todos los Items con sus Bids

Los Items que tienen Bids

Page 29: 5. JPA QL

Joins implícitos en asociaciones

� Cuando se accede a propiedades a lo largo de un camino (path)

nov-08 Alberto MFA [email protected] 29

Bid join ItemItem join User Acceso a propiedad

También se puede usar en select

Page 30: 5. JPA QL

Joins implícitos

� Solo se permiten en caminos (path) que pasen a través de asociaciones many-to-one o one-to-one

nov-08 Alberto MFA [email protected] 30

to-one o one-to-one

� El final del camino NO puede ser multivaluado

� P.e. item.bids.amount es ilegal

Page 31: 5. JPA QL

Joins implícitos en SQL

nov-08 Alberto MFA [email protected] 31

Page 32: 5. JPA QL

Joins en FROM

� Cuando el camino de asociaciones resulta en un conjunto

nov-08 Alberto MFA [email protected] 32

one-to-many

many-to-many

Page 33: 5. JPA QL

Joins en FROM

� También left y right join

nov-08 Alberto MFA [email protected] 33

Los Item %name% y sus Bids aunque haya Itemque no tienen Bids

Page 34: 5. JPA QL

Join explícito en SQL

nov-08 Alberto MFA [email protected] 34

Page 35: 5. JPA QL

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

nov-08 Alberto MFA [email protected] 35

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

Page 36: 5. JPA QL

Fetch join en FROM

Se cargan los Item que pasan la restricción y sus colecciones asociadas de

nov-08 Alberto MFA [email protected] 36

colecciones asociadas de Bids de forma agresiva (eager), no lazy

El resultado es una List() de Item. Ya no son pares.

Page 37: 5. JPA QL

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

nov-08 Alberto MFA [email protected] 37

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

Nota: JPA por defecto carga eagerasociaciones …-to-one, es útil si hay mapeo fetch=LAZY y se quiere forzar

Page 38: 5. JPA QL

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)

nov-08 Alberto MFA [email protected] 38

colección (problema del producto cartesiano)

� La estrategia del mapeo se ignora

� Se pueden cargar duplicados

� setMaxResults(…) y setFirstResult(…) se desaconsejan

Page 39: 5. JPA QL

Fetch join recovecos

Se pueden cargar duplicados, para evitarlos …

nov-08 Alberto MFA [email protected] 39

No se puede usar un alias en SELECT ni WHERE

duplicados, para evitarlos …

Page 40: 5. JPA QL

� El ajuste del join se hace en el WHERE

� Es práctico para consultas sobre clases no asociadas

Theta-style en WHERE

no asociadas

nov-08 Alberto MFA [email protected] 40

Da pares

Page 41: 5. JPA QL

Comparación de identificadores

equivalentes

nov-08 Alberto MFA [email protected] 41

Diferencia: la primera no carga Item, la segunda sí

Page 42: 5. JPA QL

Comparación de id en ejecución

nov-08 Alberto MFA [email protected] 42

Page 43: 5. JPA QL

Consultas de agregados

nov-08 Alberto MFA [email protected] 43

Page 44: 5. JPA QL

Funciones en SELECT

count() min() max() sum() avg()

nov-08 Alberto MFA [email protected] 44

Page 45: 5. JPA QL

Consulta de totales

Formación de grupos

Tabla

+

Criterios de

GROUP BY

Curso 2005-2006 SID2-GAP 45

Resultados

Tabla

Cálculos sobre los grupos

Selección de grupos

Criterios de selección de filas

HAVING

Funciones de agregados

Page 46: 5. JPA QL

Como en SQL cualquier

Agrupamiento

� Cláusula GROUP BY (como en SQL)

nov-08 Alberto MFA [email protected] 46

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

Page 47: 5. JPA QL

Restricción de grupos con HAVING

� Mismas reglas que en SQL

Solo puede aparecer en

nov-08 Alberto MFA [email protected] 47

Solo puede aparecer en HAVING una función de agregado o una propiedad (o alias) usado en GROUP BY

Page 48: 5. JPA QL

Instanciación dinámica en SELECT

nov-08 Alberto MFA [email protected] 48

� Cada fila devuelve un objeto de la clase que se especifica

� La clase debe existir y no necesita estar mapeada

Las consultas que no devuelven entidades pueden tener rendimiento al no meter resultados en contexto de persistencia

Page 49: 5. JPA QL

Subselects

� En SQL una subselect puede ir en SELECT, FROM o WHERE

�� En En JPA QL JPA QL sólosólo puede ir en el WHEREpuede ir en el WHERE

nov-08 Alberto MFA [email protected] 49

�� En En JPA QL JPA QL sólosólo puede ir en el WHEREpuede ir en el WHERE

� Las debe soportar la BDD

� MySQL en versiones anteriores a 4.?? no tiene subselects

Page 50: 5. JPA QL

Subselects

Correlada: puede tener peor rendimiento

nov-08 Alberto MFA [email protected] 50

Siempre entre paréntesis

No correlada: no tiene impacto de rendimiento

Page 51: 5. JPA QL

Cuantificación

� Una subselect puede devolver una sola fila (normalmente agregados) o varias

� En el caso de varias se usan con

nov-08 Alberto MFA [email protected] 51

� En el caso de varias se usan con cuantificación

� ALL, ANY (o SOME), IN

Page 52: 5. JPA QL

Cuantificación ejemplos

nov-08 Alberto MFA [email protected] 52

Page 53: 5. JPA QL

Funciones con subselect implícitas

nov-08 Alberto MFA [email protected] 53