Post on 28-Oct-2015
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