Clase 16 3 JPA Consultas

Post on 28-Oct-2015

100 views 8 download

Transcript of Clase 16 3 JPA Consultas

Bases de Datos

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

MsC.

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

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

Consultas

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

• Los objetos Query se construyen usando el EntityManager

4

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

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

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

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

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

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

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

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;

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>

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

Crear Consultas estáticas

15

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

Crear Consultas estáticas

16

Las consultas se escriben en cada una de las entidades asociadas

Crear Consultas estáticas

17

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

Invocar Consultas estáticas

19

consultas equivalentes

Invocar Consultas estáticas

20

Invocar Consultas estáticas

21

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

Relaciones entre Entidades

22

Relaciones entre Entidades

23

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

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

Relación uno a muchos –lado 1-

25

1. Se indica mediante la anotación @OneToMany

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

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

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)

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

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

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

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

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

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

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

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

Bibliografía

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

37