53
Consultas en JPA-QL Sistemas de Persistencia de Objetos

Consultas en JPA-QL - pamsa. · PDF fileConsultas con nombre ... Joins: inner, left y right outer ... Bid join Item Item join User Acceso a propiedad También se puede usar en select

  • Upload
    phamanh

  • View
    232

  • Download
    1

Embed Size (px)

Citation preview

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

nov-08 Alberto MFA [email protected] 4

� QBC y QBE (Query By Criteria)

� SQL Directo

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

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?

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)

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

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

nov-08 Alberto MFA [email protected] 12

� getSingleResult() de uno o ninguno

Así ya no… pero puede no haber ninguno

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

nov-08 Alberto MFA [email protected] 14

Consultas básicas

nov-08 Alberto MFA [email protected] 15

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

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)

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

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

Funciones

JPA

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)

nov-08 Alberto MFA [email protected] 25

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

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)

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

Joins: inner, left y right outer

nov-08 Alberto MFA [email protected] 28

Todos los Items con sus Bids

Los Items que tienen Bids

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

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

Joins implícitos en SQL

nov-08 Alberto MFA [email protected] 31

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

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

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

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

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.

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

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

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 …

� 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

Comparación de identificadores

equivalentes

nov-08 Alberto MFA [email protected] 41

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

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

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

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

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

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

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

Subselects

Correlada: puede tener peor rendimiento

nov-08 Alberto MFA [email protected] 50

Siempre entre paréntesis

No correlada: no tiene impacto de rendimiento

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

Cuantificación ejemplos

nov-08 Alberto MFA [email protected] 52

Funciones con subselect implícitas

nov-08 Alberto MFA [email protected] 53