12.3. JPA QL

53
Consultas en JPA-QL Sistemas de Persistencia de Objetos

Transcript of 12.3. JPA QL

Consultas en JPA-QL

Sistemas de Persistencia de Objetos

ene-09 Alberto MFA [email protected] 2

Contenidos

ene-09 Alberto MFA [email protected] 3

Preparación y ejecución

ene-09 Alberto MFA [email protected] 4

Creación

� HQL y JPA QL

� QBC y QBE (Query By Criteria)

� SQL Directo

ene-09 Alberto MFA [email protected] 5

Paginación

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

ene-09 Alberto MFA [email protected] 6

Enlace de parámetros

¿Qué pasa si escriben esto en un formulario?

Es el problema de la SQL injection

¿Qué hay en este string?

� Lo que no se debe hacer

ene-09 Alberto MFA [email protected] 7

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] 8

Enlace de parámetros

� Enlace posicional

setters sobrecargados

¡Ojo! Se empieza en 1

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

ene-09 Alberto MFA [email protected] 9

Ajustes de rendimiento

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

ene-09 Alberto MFA [email protected] 12

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] 13

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] 14

ene-09 Alberto MFA [email protected] 15

Consultas básicas

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

ene-09 Alberto MFA [email protected] 16

Curso 2005-2006 SID2-GAP 17

Partes de una consulta

Criterios de selección de filas

TablaResultados

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

FROM WHERE SELECT

ene-09 Alberto MFA [email protected] 18

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� 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

ene-09 Alberto MFA [email protected] 19

Restricción (WHERE)

� WHERE para filtrar filas

ene-09 Alberto MFA [email protected] 20

Restricción (WHERE)

ene-09 Alberto MFA [email protected] 21

Operadores de comparación y precedencia

+

_

ene-09 Alberto MFA [email protected] 22

Restricciones sobre colecciones (WHERE)

� En el WHERE

� Se pueden complementar con funciones

ene-09 Alberto MFA [email protected] 23

Funciones

JPA

Hibernate

ene-09 Alberto MFA [email protected] 24

Ordenación

� De la forma usual

ene-09 Alberto MFA [email protected] 25

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] 26

Proyección de escalares

En la select pueden ir atributos de clases…

… y resultados de funciones (las ya vistas)

Curso 2005-2006 SID2-GAP 27

Consulta sobre varias tablas

Tabla

Resultados

Tabla

+

Combinación de registros de las dos tablas

Criterios de filtrado de filas

ene-09 Alberto MFA [email protected] 28

Joins: inner, left y right outer

Todos los Itemscon sus Bids

Los Items que tienen Bids

ene-09 Alberto MFA [email protected] 29

Joins implícitos en asociaciones

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

Bid join ItemItem join User Acceso a propiedad

También se puede usar en select

ene-09 Alberto MFA [email protected] 30

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

� Solo en SELECT y WHERE

Joins implícitos traducidos a SQL

ene-09 Alberto MFA [email protected] 31

ene-09 Alberto MFA [email protected] 32

Joins en FROM

� Cuando el camino de asociaciones resulta en un conjunto

one-to-many

many-to-many

ene-09 Alberto MFA [email protected] 33

Joins en FROM

� También left y right join

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

Join explícito traducído a SQL

ene-09 Alberto MFA [email protected] 34

ene-09 Alberto MFA [email protected] 35

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] 36

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] 37

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

Nota: JPA por defecto carga eagerasociaciones …-to-one; esto es útil si hay mapeo fetch=LAZY y se quiere forzar eager para una consulta

ene-09 Alberto MFA [email protected] 38

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] 39

Fetch join recovecos

No se puede usar un alias en SELECT ni WHERE

Se pueden cargar duplicados, para evitarlos …

� El ajuste del join se hace en el WHERE

� Es práctico para consultas sobre clases no asociadas

ene-09 Alberto MFA [email protected] 40

Theta-style en WHERE

Da pares

Comparación de identificadores

ene-09 Alberto MFA [email protected] 41

equivalentes

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

Comparación de id en ejecución

ene-09 Alberto MFA [email protected] 42

ene-09 Alberto MFA [email protected] 43

Consultas de agregados

ene-09 Alberto MFA [email protected] 44

Funciones en SELECT

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

Curso 2005-2006 SID2-GAP 45

Consulta de totales

Formación de grupos

Tabla

Grupos resultado

+

Tabla

Cálculos sobre los grupos

Selección de grupos

Criterios de selección de filas

GROUP BY

HAVING

Funciones de agregados

ene-09 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

Agrupamiento

� Cláusula GROUP BY (como en SQL)

ene-09 Alberto MFA [email protected] 47

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] 48

Instanciación dinámica en SELECT

� 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 más rendimiento al no meter resultados en contexto de persistencia

ene-09 Alberto MFA [email protected] 49

Subselects

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

�� En JPA QL En JPA QL ssóólolo puede ir en el WHEREpuede ir en el WHERE

� Las debe soportar la BDD

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

ene-09 Alberto MFA [email protected] 50

Subselects

Correlada: puede tener peor rendimiento

Siempre entre paréntesis

No correlada: no tiene impacto de rendimiento

ene-09 Alberto MFA [email protected] 51

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

� ALL, ANY (o SOME), IN

ene-09 Alberto MFA [email protected] 52

Cuantificación ejemplos

ene-09 Alberto MFA [email protected] 53

Funciones con subselectimplícitas