Clase 16 3 JPA Consultas

37
Bases de Datos Java Persistence API II – Consultas - Ing. Julio Ernesto Carreño Vargas MsC.

Transcript of Clase 16 3 JPA Consultas

Page 1: Clase 16 3 JPA Consultas

Bases de Datos

Java Persistence API II – Consultas - Ing. Julio Ernesto Carreño Vargas

MsC.

Page 2: Clase 16 3 JPA Consultas

Consultas

• En el JPA una consulta es similar a una consulta en la base de datos, pero en lugar de consultar tablas se consultan entidades.

2

Page 3: Clase 16 3 JPA Consultas

Consultas

• No se usa SQL (Structured Query Language) se usa un lenguaje llamado JPQL (Java Persistence Query Language)

• Las consultas en JPQL son independientes del DBMS

3

Page 4: Clase 16 3 JPA Consultas

Consultas

• Una consulta se implementa en el código como un objeto de tipo Query

• Los objetos Query se construyen usando el EntityManager

4

Page 5: Clase 16 3 JPA Consultas

Tipos de Consultas

• Estáticas

– Se define la consulta usando una anotación (@)

– Tiene un nombre

– Permite alguna preparación de la consulta

• Dinámicas

– Las consultas se crean directamente usando el JPQL sin anotaciones y sin nombre

5

Page 6: Clase 16 3 JPA Consultas

Consulta Dinámica que retorna 1 entidad

6

1. Crear un entity manager 2. Crear el objeto consulta usando el EM 3. Usar el método getSingleResult() del objeto consulta creado en

el paso 2 i. Convierta el objeto que retorna la consulta a un objeto de

tipo Estudiante usando una operación de cast: (Estudiante)

Si la consulta retorna más de una entidad se producirá un error en tiempo de ejecución

Page 7: Clase 16 3 JPA Consultas

Consulta Dinámica que retorna 1 entidad

7

1. Alias de la Clase para sus objetos 2. Seleccione los objetos e de tipo Estudiante

Observe la ausencia del where Esta consulta subirá en memoria todos los registros de la tabla Estudiante, una entidad por cada registro

Page 8: Clase 16 3 JPA Consultas

Consultas JPQL dinámicas de única entidad con predicados

8

Para los predicados se agrega la claúsula WHERE seguida de una condición

Se deben prefijar los atributos con el alias asignado a la entidad e.documento

Page 9: Clase 16 3 JPA Consultas

Consultas JPQL dinámicas de única entidad con predicados y parámetros

9

Para las consultas parametrizadas se usan los parámetros con nombre

Un parámetro con nombre comienza con el signo : seguido del nombre

del parámetro

1. Crear el parámetro con nombre 2. Asignar el valor al parámetro usando el método setParameter del objeto

consulta

Page 10: Clase 16 3 JPA Consultas

Consultas JPQL dinámicas de múltiples entidades

• Las consultas que retornan muchas entidades deben manejarse con colecciones de objetos

• Una colección de objetos almacena referencias a objetos de una clase

– Es similar a un arreglo de la programación tradicional, pero difiere en que su tamaño es dinámico.

10

Page 11: Clase 16 3 JPA Consultas

Consultas JPQL dinámicas de múltiples entidades

11

1. Colección de objetos de tipo CD i. ArrayList<CD> cds; ii. ArrayList<DVD> dvds;

2. Objetos de tipo CD

Page 12: Clase 16 3 JPA Consultas

Consultas JPQL dinámicas de múltiples entidades

12

1. Para representar las colecciones se pueden usar también i. List<CD> cds; ii. Vector<CD> cds; iii. Set<CD> cds; iv. Collection<CD> cds;

Page 13: Clase 16 3 JPA Consultas

Consultas JPQL dinámicas de múltiples entidades

13

1. El método getResultList retorna una colección de objetos i. La colección es convertida a un ArrayList<Estudiante>

Page 14: Clase 16 3 JPA Consultas

Tipos de Consultas

• Estáticas

– Se define la consulta usando una anotación (@)

– Tiene un nombre

– Permite alguna preparación de la consulta

• Dinámicas

– Las consultas se crean directamente usando el JPQL sin anotaciones y sin nombre

14

Page 15: Clase 16 3 JPA Consultas

Crear Consultas estáticas

15

Se usa la anotación @NamedQuery La consulta tiene un nombre La consulta tiene asociado un query

Page 16: Clase 16 3 JPA Consultas

Crear Consultas estáticas

16

Las consultas se escriben en cada una de las entidades asociadas

Page 17: Clase 16 3 JPA Consultas

Crear Consultas estáticas

17

Page 18: Clase 16 3 JPA Consultas

Conjunto de Consultas

18

Cuando existe más de una consulta se usa la anotación @NamedQueries

Observe las llaves ({}) que permiten aislar la definición de cada consulta, que van separadas por una coma

Page 19: Clase 16 3 JPA Consultas

Invocar Consultas estáticas

19

consultas equivalentes

Page 20: Clase 16 3 JPA Consultas

Invocar Consultas estáticas

20

Page 21: Clase 16 3 JPA Consultas

Invocar Consultas estáticas

21

La sentencia for permite recorrer y manipular toda la colección de Estudiantes

Page 22: Clase 16 3 JPA Consultas

Relaciones entre Entidades

22

Page 23: Clase 16 3 JPA Consultas

Relaciones entre Entidades

23

La definición de las llaves foráneas en las tablas permite crear relaciones entre entidades

Page 24: Clase 16 3 JPA Consultas

Relaciones bidireccionales

24

Ambas entidades tienen referencia a la otra entidad Observe que la relación tiene una flecha en ambas terminales

La relación es navegable en ambos sentidos

Page 25: Clase 16 3 JPA Consultas

Relación uno a muchos –lado 1-

25

1. Se indica mediante la anotación @OneToMany

Page 26: Clase 16 3 JPA Consultas

Relación uno a muchos

26

1. El atributo mappedBy identifica como se referencia esta entidad(Estudiante) en el lado muchos de la relación (Telefono)

2. Observe la anotación @ManyToOne en el lado 1 de la relación

Page 27: Clase 16 3 JPA Consultas

Relación uno a muchos –lado muchos-

27

1. La anotación @JoinColumn indica la columna en la tabla por la que se hace el join entre las entidades participantes en la relación

Page 28: Clase 16 3 JPA Consultas

Relaciones entre Entidades

28

En una relación existe una entidad propietaria de la relación y una entidad inversa

La entidad que tiene el atributo mappedBy se dice que es la entidad propietaria

Conocer el propietario es importante para determinar cómo se hacen las actualizaciones en la BD (Cascada)

Page 29: Clase 16 3 JPA Consultas

Relaciones entre Entidades y Carga de Datos

29

Al ejecutar la consulta anterior y gracias a las relaciones entre las entidades, para cada uno de los estudiantes se cargan los teléfonos respectivos La consulta no requiere hacer un join explicitamente

Page 30: Clase 16 3 JPA Consultas

Relaciones entre Entidades y Carga de Datos

30

TopLink - Detallado]: 2009.06.09 06:50:26.768--ServerSession(15594486)--Connection(15513215)--Thread(Thread[main,5,main])--SELECT DOCUMENTO, EDAD, NOMBRE FROM ESTUDIANTE [TopLink - Detallado]: 2009.06.09 06:50:27.189--ServerSession(15594486)--Connection(31168594)--Thread(Thread[main,5,main])--SELECT NUMERO, DOCUMENTO FROM TELEFONO WHERE (DOCUMENTO = ?) bind => [13508444] Julio Carreño cuenta con: 2 telefonos [TopLink - Detallado]: 2009.06.09 06:50:27.232--ServerSession(15594486)--Connection(15513215)--Thread(Thread[main,5,main])--SELECT NUMERO, DOCUMENTO FROM TELEFONO WHERE (DOCUMENTO = ?) bind => [60380187] martha rico cuenta con: 0 telefonos

Page 31: Clase 16 3 JPA Consultas

Relaciones entre Entidades y Carga de Datos

• Los tipos de carga de datos son:

– EAGER

• Los datos se cargan cuando la entidad referenciadora se carga

– LAZY

• Retarda la recuperación de los datos sólo hasta que se necesiten

• El valor por defecto es EAGER en las relaciones 1 a 1 y LAZY en las demás relaciones

31

Page 32: Clase 16 3 JPA Consultas

Relaciones entre Entidades y Carga de Datos tardía

32

1. Se utiliza el atributo fetch con el valor FetchType.LAZY en la anotación @OneToMany de la entidad propietaria de la relación

Page 33: Clase 16 3 JPA Consultas

Relaciones entre Entidades y Carga de Datos tardía

33

--SELECT DOCUMENTO, EDAD, NOMBRE FROM ESTUDIANTE Julio Carreño cuenta con: {IndirectList: not instantiated} telefonos martha rico cuenta con: {IndirectList: not instantiated} telefonos

Page 34: Clase 16 3 JPA Consultas

Relación muchos a muchos

34

Observe la anotación @ManyToMany en ambos lados de la relación En este caso la entidad propietaria de la relación es Employees

Recuerde que en el modelo relacional una relación muchos a muchos se representa con una tabla adicional con las llaves de ambas relaciones

Page 35: Clase 16 3 JPA Consultas

Relaciones Unidireccionales

35

Sólo una entidad tienen referencia a la otra entidad Observe que la relación tiene flecha en un sólo terminal

La relación SOLO es navegable en un sentido

Page 36: Clase 16 3 JPA Consultas

Relación uno a uno unidireccional

36

Observe la anotación @OneToOne en la entidad Employee En este caso la entidad propietaria de la relación es Employee

Page 37: Clase 16 3 JPA Consultas

Bibliografía

• Modern Database Management.9th Edition.Jeffrey A. Hoffer, Mary B. Prescott, Heikki Topi. 2009

37