Está en la página 1de 53

Consultas en JPA-QL

Sistemas de Persistencia de
Objetos

Contenidos

ene-09

Alberto MFA alb@uniovi.es

Preparacin y ejecucin

ene-09

Alberto MFA alb@uniovi.es

Creacin


HQL y JPA QL

QBC y QBE

SQL Directo

ene-09

(Query By Criteria)

Alberto MFA alb@uniovi.es

Paginacin

El primer resultado es el 0

Las Query permiten


encadenamiento de
mtodos

ene-09

Nmero mximo de filas a


recuperar desde la fijada por
setFirstResult()
Ejecuta la consulta y
devuelve una List()
de objetos User

Alberto MFA alb@uniovi.es

Enlace de parmetros


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


ene-09

Alberto MFA alb@uniovi.es

Enlace de parmetros


Enlace nominal (recomendado)

setParameter() sobrecargado para


java.util.Date, java.util.Calendar y
Object (ver documentacin)

ene-09

Alberto MFA alb@uniovi.es

Enlace de parmetros


Enlace posicional
El orden de parmetros
no tiene por qu ser
secuencial

Ojo! Se empieza en 1
setters
sobrecargados
ene-09

Alberto MFA alb@uniovi.es

Ajustes de rendimiento

ene-09

Alberto MFA alb@uniovi.es

Ajustes de rendimiento

Los hints son todos dependientes de


implementacin, no estndar JPA
Si un hint no es soportado es ignorado
silenciosamente

ene-09

Alberto MFA alb@uniovi.es

10

Hints: ejemplos

ene-09

Alberto MFA alb@uniovi.es

11

Ejecucin


Se produce al invocar a:



getResultList()
getSingleResult()

Excepcin si ms
de uno o ninguno

As ya no pero puede
no haber ninguno

ene-09

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

ene-09

Alberto MFA alb@uniovi.es

13

ene-09

Alberto MFA alb@uniovi.es

14

Consultas bsicas

ene-09

Alberto MFA alb@uniovi.es

15

Partes de una consulta




Seleccin



Restriccin


Fuente de datos  FROM


Una sola o combinacin de ellas
Filtrado de filas  WHERE

Proyeccin


ene-09

Seleccin de partes de las filas que pasan


el filtro  SELECT
Alberto MFA alb@uniovi.es

16

Partes de una consulta


FROM

WHERE

Resultados

Tabla
Criterios de
seleccin de filas

Curso 2005-2006

SELECT

SID2-GAP

Puede que haya


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

17

Seleccin (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 polimrficas






ene-09

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 alb@uniovi.es

Tambin
polimorfismo sobre
18
interfaces

Restriccin (WHERE)


WHERE para filtrar filas

ene-09

Alberto MFA alb@uniovi.es

19

Restriccin (WHERE)

ene-09

Alberto MFA alb@uniovi.es

20

Operadores de comparacin y
precedencia
_

+
ene-09

Alberto MFA alb@uniovi.es

21

Restricciones sobre
colecciones (WHERE)



En el WHERE
Se pueden complementar con funciones

ene-09

Alberto MFA alb@uniovi.es

22

JPA

Funciones
Hibernate

ene-09

Alberto MFA alb@uniovi.es

23

Ordenacin


De la forma usual

ene-09

Alberto MFA alb@uniovi.es

24

Proyeccin
(Esta consulta es intil ya
que da un producto
cartesiano)

Cada fila es un vector de los


elementos proyectados (Item y Bid)

ene-09

Alberto MFA alb@uniovi.es

25

Proyeccin de escalares

En la select pueden ir
atributos de clases
y resultados de funciones
(las ya vistas)

ene-09

Alberto MFA alb@uniovi.es

26

Consulta sobre varias tablas

Tabla

Criterios de filtrado
de filas

Resultados

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

Alberto MFA alb@uniovi.es

28

Joins implcitos en
asociaciones


Cuando se accede a propiedades a lo


largo de un camino (path)

Bid join Item

Item join User

Acceso a propiedad

Tambin se puede usar en select


ene-09

Alberto MFA alb@uniovi.es

29

Joins implcitos


Solo se permiten en caminos (path) que


pasen a travs de asociaciones manyto-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

ene-09

Alberto MFA alb@uniovi.es

30

Joins implcitos traducidos a


SQL

ene-09

Alberto MFA alb@uniovi.es

31

Joins en FROM


Cuando el camino de asociaciones


resulta en un conjunto

many-to-many
one-to-many

ene-09

Alberto MFA alb@uniovi.es

32

Joins en FROM


Tambin left y right join

Los Item %name% y sus


Bids aunque haya Item
que no tienen Bids

ene-09

Alberto MFA alb@uniovi.es

33

Join explcito traducdo a SQL

ene-09

Alberto MFA alb@uniovi.es

34

Fetch join en FROM





Salvo mapeo en contra todas las colecciones


se cargan lazy
La configuracin 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 coleccin asociada al
momento (eager fetching)
Es un ajuste fundamental en el rendimiento
de algunas consultas

ene-09

Alberto MFA alb@uniovi.es

35

Fetch join en FROM


Se cargan los Item que
pasan la restriccin 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 alb@uniovi.es

36

Fetch join en FROM




Tambin 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 tambin carga


de forma agresiva item y
bidder pero solo los bids que
tienen item
y bidder
ene-09

Nota: JPA por defecto carga eager


asociaciones -to-one; esto es til
si hay mapeo fetch=LAZY y se
quiere forzar eager para una
consulta
Alberto MFA alb@uniovi.es

37

Fetch join: recovecos








No se puede usar un alias en SELECT ni


WHERE
No se debe hacer fetch join ms de una
coleccin (problema del producto cartesiano)
La estrategia del mapeo se ignora
Se pueden cargar duplicados
setMaxResults() y
setFirstResult() se desaconsejan

ene-09

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

ene-09

Alberto MFA alb@uniovi.es

39

Theta-style en WHERE



El ajuste del join se hace en el WHERE


Es prctico para consultas sobre clases
no asociadas

Da pares

ene-09

Alberto MFA alb@uniovi.es

40

Comparacin de
identificadores
equivalentes

Diferencia: la primera no carga Item,


la segunda s
ene-09

Alberto MFA alb@uniovi.es

41

Comparacin de id en
ejecucin

ene-09

Alberto MFA alb@uniovi.es

42

Consultas de agregados

ene-09

Alberto MFA alb@uniovi.es

43

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

ene-09

Alberto MFA alb@uniovi.es

44

Consulta de totales
GROUP BY
Formacin de
grupos

+
Tabla
Criterios de
seleccin de filas

Funciones de
agregados

Clculos sobre
los grupos

Tabla
Grupos
resultado

Seleccin de
grupos
HAVING

Curso 2005-2006

SID2-GAP

45

Agrupamiento


Clusula GROUP BY (como en SQL)


Como en SQL cualquier
propiedad o alias que
aparezca en SELECT
fuera de una funcin de
agregado debe aparecer
tambin en la clusula
GROUP BY

ene-09

Alberto MFA alb@uniovi.es

46

Restriccin de grupos con


HAVING


Mismas reglas que en SQL


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

ene-09

Alberto MFA alb@uniovi.es

47

Instanciacin dinmica en
SELECT


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

Cada fila devuelve un


objeto de la clase que se
especifica
La clase debe existir y no
necesita estar mapeada
Alberto MFA alb@uniovi.es

48

Subselects





En SQL una subselect puede ir en


SELECT, FROM o WHERE
En JPA QL slo puede ir en el WHERE
Las debe soportar la BDD


ene-09

MySQL en versiones anteriores a 4.?? no


tiene subselects

Alberto MFA alb@uniovi.es

49

Subselects
Correlada: puede tener peor
rendimiento

No correlada: no tiene
impacto de rendimiento
Siempre entre
parntesis
ene-09

Alberto MFA alb@uniovi.es

50

Cuantificacin


Una subselect puede devolver una sola


fila (normalmente resultado de una
funcin de agregado) o varias
En el caso de varias se usan con
cuantificacin


ene-09

ALL, ANY (o SOME), IN

Alberto MFA alb@uniovi.es

51

Cuantificacin ejemplos

ene-09

Alberto MFA alb@uniovi.es

52

Funciones con subselect


implcitas

ene-09

Alberto MFA alb@uniovi.es

53

También podría gustarte