Consultas en JPA-QL. Sistemas de Persistencia de Objetos

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 ...
10 downloads 0 Views 687KB Size
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