From fdb82ae7f9ba5cd3b374d16737cd3ca94a419ea2 Mon Sep 17 00:00:00 2001 From: devfzn Date: Wed, 6 Sep 2023 19:59:09 -0300 Subject: [PATCH] JPA Consultas avanzadas...: Aula 2 --- 010_spring_boot/README.md | 3 +- .../jpa/tienda2/database/tienda.mv.db | Bin 32768 -> 28672 bytes .../latam/alura/tienda/dao/CategoriaDao.java | 1 + .../com/latam/alura/tienda/dao/PedidoDao.java | 33 ++++++++++++ .../latam/alura/tienda/dao/ProductoDao.java | 3 +- .../latam/alura/tienda/modelo/Producto.java | 2 + .../alura/tienda/prueba/RegistroDePedido.java | 15 ++++++ .../latam/alura/tienda/vo/ReporteDeVenta.java | 49 ++++++++++++++++++ 010_spring_boot/jpa_avanzado.md | 43 +++++++++++++-- 9 files changed, 140 insertions(+), 9 deletions(-) create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/vo/ReporteDeVenta.java diff --git a/010_spring_boot/README.md b/010_spring_boot/README.md index b9f2c3b..f0acb8f 100644 --- a/010_spring_boot/README.md +++ b/010_spring_boot/README.md @@ -10,5 +10,4 @@ Java y [JDBC](./jdbc.md) - [Curso](https://app.aluracursos.com/course/persistencia-jpa-hibernate) Persistencia con [JPA - Hibernate](./jpa_persistencia_hibernate.md) - [Curso](https://app.aluracursos.com/course/java-jpa-consultas-avanzadas-rendimiento-modelos-complejos) -[JPA](./jpa_2.avanzado.md) -consultas avanzadas, rendimiento y modelos complejos +JPA [consultas avanzadas, rendimiento y modelos complejos](./jpa_avanzado.md) diff --git a/010_spring_boot/jpa/tienda2/database/tienda.mv.db b/010_spring_boot/jpa/tienda2/database/tienda.mv.db index a46f0570485689b4af2cdc113c127e0c1c7ef501..ab155256f841b11ed71735560b6e27365d6b867f 100644 GIT binary patch literal 28672 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 X17ZICg#YjRFM1Y4W?1M#`2YV6B(VYx literal 32768 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 ReporteVentas() { + String jpql = "SELECT producto.nombre, SUM(item.cantidad), MAX(pedido.fecha)" + + " FROM Pedido pedido" + + " JOIN pedido.items item" + + " JOIN item.producto producto" + + " GROUP BY producto.nombre" + + " ORDER BY item.cantidad DESC"; + return em.createQuery(jpql, Object[].class).getResultList(); + } + + public List ReporteVentasVO() { + String jpql = "SELECT new com.latam.alura.tienda.vo.ReporteDeVenta(" + + "producto.nombre, SUM(item.cantidad), MAX(pedido.fecha))" + + " FROM Pedido pedido" + + " JOIN pedido.items item" + + " JOIN item.producto producto" + + " GROUP BY producto.nombre" + + " ORDER BY item.cantidad DESC"; + return em.createQuery(jpql, ReporteDeVenta.class).getResultList(); + } + } diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java index 4688d56..79fc24e 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java @@ -48,7 +48,6 @@ public class ProductoDao { } public BigDecimal consultaPrecioPorNombreDeProducto(String nombre) { - String jpql = "SELECT P.precio FROM Producto AS P WHERE P.nombre=:nombre"; - return em.createQuery(jpql, BigDecimal.class).setParameter("nombre", nombre).getSingleResult(); + return em.createNamedQuery("Producto.consultaDePrecio", BigDecimal.class).setParameter("nombre", nombre).getSingleResult(); } } diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java index 0db6112..d3059f4 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java @@ -10,10 +10,12 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; +import javax.persistence.NamedQuery; import javax.persistence.Table; @Entity @Table(name="productos") +@NamedQuery(name="Producto.consultaDePrecio", query="SELECT P.precio FROM Producto AS P WHERE P.nombre=:nombre") public class Producto { @Id diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDePedido.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDePedido.java index e596c32..2b6c957 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDePedido.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDePedido.java @@ -1,6 +1,7 @@ package com.latam.alura.tienda.prueba; import java.math.BigDecimal; +import java.util.List; import javax.persistence.EntityManager; //import javax.persistence.EntityManagerFactory; @@ -16,6 +17,7 @@ import com.latam.alura.tienda.modelo.ItemsPedido; import com.latam.alura.tienda.modelo.Pedido; import com.latam.alura.tienda.modelo.Producto; import com.latam.alura.tienda.utils.JPAUtils; +import com.latam.alura.tienda.vo.ReporteDeVenta; public class RegistroDePedido { @@ -39,6 +41,19 @@ public class RegistroDePedido { pedidoDao.guardar(pedido); em.getTransaction().commit(); + BigDecimal valorTotal = pedidoDao.valorTotalVendido(); + System.out.println("Valor total del pedido: "+valorTotal); + Double valorPromedio = pedidoDao.valorPromedioVendido(); + System.out.println("Valor promedio del pedido: "+valorPromedio); + List reporte = pedidoDao.ReporteVentas(); + for (Object[] objects : reporte) { + System.out.print(objects[0] +", "); + System.out.print(objects[1] +", "); + System.out.println(objects[2]); + } + + List reporteVo = pedidoDao.ReporteVentasVO(); + reporteVo.forEach(System.out::println); } public static void RegistrarPedido() { diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/vo/ReporteDeVenta.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/vo/ReporteDeVenta.java new file mode 100644 index 0000000..30fe520 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/vo/ReporteDeVenta.java @@ -0,0 +1,49 @@ +package com.latam.alura.tienda.vo; + +import java.time.LocalDate; + +public class ReporteDeVenta { + private String nombreDelProducto; + private Long cantidadDeProducto; + private LocalDate fechaDeUltimaVenta; + + public ReporteDeVenta(String nombreDelProducto, Long cantidadDeProducto, LocalDate fechaDeUltimaVenta) { + this.nombreDelProducto = nombreDelProducto; + this.cantidadDeProducto = cantidadDeProducto; + this.fechaDeUltimaVenta = fechaDeUltimaVenta; + } + + public String getNombreDelProducto() { + return nombreDelProducto; + } + + public void setNombreDelProducto(String nombreDelProducto) { + this.nombreDelProducto = nombreDelProducto; + } + + public Long getCantidadDeProducto() { + return cantidadDeProducto; + } + + public void setCantidadDeProducto(Long cantidadDeProducto) { + this.cantidadDeProducto = cantidadDeProducto; + } + + public LocalDate getFechaDeUltimaVenta() { + return fechaDeUltimaVenta; + } + + public void setFechaDeUltimaVenta(LocalDate fechaDeUltimaVenta) { + this.fechaDeUltimaVenta = fechaDeUltimaVenta; + } + + @Override + public String toString() { + return "ReporteDeVenta [" + (nombreDelProducto != null ? "nombreDelProducto=" + nombreDelProducto + ", " : "") + + (cantidadDeProducto != null ? "cantidadDeProducto=" + cantidadDeProducto + ", " : "") + + (fechaDeUltimaVenta != null ? "fechaDeUltimaVenta=" + fechaDeUltimaVenta : "") + "]"; + } + + + +} diff --git a/010_spring_boot/jpa_avanzado.md b/010_spring_boot/jpa_avanzado.md index 752d78e..2e0329a 100644 --- a/010_spring_boot/jpa_avanzado.md +++ b/010_spring_boot/jpa_avanzado.md @@ -2,7 +2,8 @@ -Retomando el proyecto [anterior](./jpa/tienda/src/main/java/com/latam/alura/tienda/) +Trabajando sobre el [proyecto](./jpa/tienda/src/main/java/com/latam/alura/tienda/) +anterior ```mermaid erDiagram @@ -18,7 +19,7 @@ erDiagram id biging PK nombre string } - Clientes ||--o{ Pedidos : tiene + Clientes ||--|{ Pedidos : tiene Clientes { id bigint PK nombre string @@ -81,7 +82,39 @@ creada anteriormente - Mapeo de nuevas entidades en la aplicación según el modelado de la base de datos -- Mapeo de una relación con cardinalidad de muchos a muchos -- Mapeo de una relación bidireccional -- Persitencia entidades que tienen relaciones bidireccionales +- Mapeo de relación con cardinalidad de muchos a muchos +- Mapeo de relación bidireccional +- Persistencia entidades que tienen relaciones bidireccionales + + +### Funciones de agregación SQL + +| Función | Descripción | +| - | - | +| **AVG** | Calcula el promedio de los valores de un campo | +| **COUNT** | Devuelve en número de registros de la selección | +| **SUM** | Devuelve la suma de todos los valores de un campo | +| **MAX** | Devuelve el valor más alto de un campo | +| **MIN** | Devuelve el valor más bajo de un campo | + +#### Reporte de ventas + +| PRODUCTO | CANT. VENDIDA | ULTIMA VENTA | +| - | :-: | - | +| Celular Motorola X9 | 240 | 01/02/23 | +| Xbox Series S | 198 | 10/02/23 | +| Framework Laptop | 71 | 20/02/2023 | + +
+ +**NamedQuerys**: Estas se declaran en la clase de entidad. + +#### Sumario Aula 2 + +- Realización de consultas utilizando funciones de agregación (**min, max, avg +y sum**) +- Consultas de reporte/informes usando JPQL +- Uso del nuevo recurso seleccionado en consultas JPQL +- Consultas mediante **NamedQuerys** +