From 1ccd4f5e18068891a128707020afda7f391800ab Mon Sep 17 00:00:00 2001 From: devfzn Date: Thu, 7 Sep 2023 15:05:10 -0300 Subject: [PATCH] JPA Consultas avanzadas...: FIN --- 010_spring_boot/README.md | 2 + .../jpa/tienda2/database/tienda.mv.db | Bin 28672 -> 36864 bytes .../latam/alura/tienda/dao/CategoriaDao.java | 5 + .../com/latam/alura/tienda/dao/PedidoDao.java | 5 + .../latam/alura/tienda/dao/ProductoDao.java | 48 +++++ .../latam/alura/tienda/modelo/Categoria.java | 34 +-- .../alura/tienda/modelo/CategoriaId.java | 59 ++++++ .../latam/alura/tienda/modelo/Cliente.java | 20 +- .../alura/tienda/modelo/DatosPersonales.java | 55 +++++ .../alura/tienda/modelo/Electronico.java | 36 ++++ .../alura/tienda/modelo/ItemsPedido.java | 5 +- .../com/latam/alura/tienda/modelo/Libro.java | 36 ++++ .../com/latam/alura/tienda/modelo/Pedido.java | 15 +- .../latam/alura/tienda/modelo/Producto.java | 8 +- .../alura/tienda/prueba/LoadRecords.java | 104 ++++++++++ .../tienda/prueba/PruebaAPICriteria.java | 54 +++++ .../tienda/prueba/PruebaDeParametros.java | 54 +++++ .../tienda/prueba/PruebaDeRendimiento.java | 30 +++ .../tienda/prueba/RegistroDeProducto.java | 71 +------ .../latam/alura/tienda/utils/categoria.txt | 8 + .../com/latam/alura/tienda/utils/cliente.txt | 8 + .../com/latam/alura/tienda/utils/producto.txt | 10 + 010_spring_boot/jpa_avanzado.md | 196 +++++++++++++++++- 23 files changed, 757 insertions(+), 106 deletions(-) create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Electronico.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Libro.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/LoadRecords.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaAPICriteria.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeParametros.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeRendimiento.java create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/categoria.txt create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/cliente.txt create mode 100644 010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/producto.txt diff --git a/010_spring_boot/README.md b/010_spring_boot/README.md index f0acb8f..fc4e273 100644 --- a/010_spring_boot/README.md +++ b/010_spring_boot/README.md @@ -5,9 +5,11 @@ Tablero en [trello](https://trello.com/b/gWJsG18e/g5-formaci%C3%B3n-spring-boot) - [Curso](https://app.aluracursos.com/course/introduccion-sql-mysql-manipule-consulte-datos) Java y [bases de datos](./base_de_datos.md) - Lectura [JDBC](https://www.aluracursos.com/blog/conociendo-el-jdbc) +- Lectura [Maven](https://www.aluracursos.com/blog/que-es-maven) - [Curso](https://app.aluracursos.com/course/java-jdbc-trabajando-base-datos) 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 [consultas avanzadas, rendimiento y modelos complejos](./jpa_avanzado.md) +- Lectura [Rest](https://www.aluracursos.com/blog/rest-concepto-y-fundamentos) diff --git a/010_spring_boot/jpa/tienda2/database/tienda.mv.db b/010_spring_boot/jpa/tienda2/database/tienda.mv.db index ab155256f841b11ed71735560b6e27365d6b867f..9b77537dab297566ef9f61311a9210aad7ff07a1 100644 GIT binary patch literal 36864 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 diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java index 3f124a4..e6614ab 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java @@ -31,6 +31,11 @@ public class CategoriaDao { return em.find(Categoria.class, id); } + public Categoria consultaPorNombre(String nombre){ + String jpql =" SELECT C FROM Categoria AS C WHERE C.nombre=:nombre "; + return em.createQuery(jpql,Categoria.class).setParameter("nombre", nombre).getSingleResult(); + } + public List consultarTodos() { String jpql = "SELECT P FROM Categoria AS P"; return em.createQuery(jpql, Categoria.class).getResultList(); diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java index bb94100..6a16065 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java @@ -84,4 +84,9 @@ public class PedidoDao { return em.createQuery(jpql, ReporteDeVenta.class).getResultList(); } + public Pedido ConsultarPedidoConCliente(Long id) { + String jpql = "SELECT P FROM Pedido P JOIN FETCH P.cliente WHERE P.id=:id"; + return em.createQuery(jpql, Pedido.class).setParameter("id", id).getSingleResult(); + } + } 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 79fc24e..a7ec9d0 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 @@ -1,9 +1,15 @@ package com.latam.alura.tienda.dao; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.List; import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import com.latam.alura.tienda.modelo.Producto; @@ -50,4 +56,46 @@ public class ProductoDao { public BigDecimal consultaPrecioPorNombreDeProducto(String nombre) { return em.createNamedQuery("Producto.consultaDePrecio", BigDecimal.class).setParameter("nombre", nombre).getSingleResult(); } + + public List consultaPorParametro(String nombre, BigDecimal precio, LocalDate fecha){ + StringBuilder jpql = new StringBuilder("SELECT P FROM Producto P WHERE 1=1"); + if (nombre != null && !nombre.trim().isEmpty()) { + jpql.append(" AND P.nombre=:nombre"); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + jpql.append(" AND P.precio=:precio"); + } + if (fecha != null) { + jpql.append(" AND P.fechaDeRegistro=:fecha"); + } + TypedQuery query = em.createQuery(jpql.toString(), Producto.class); + if (nombre != null && !nombre.trim().isEmpty()) { + query.setParameter("nombre", nombre); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + query.setParameter("precio", precio); + } + if (fecha != null) { + query.setParameter("fechaDeRegistro", fecha); + } + return query.getResultList(); + } + + public List consultaPorParametrosConAPICriteria(String nombre, BigDecimal precio, LocalDate fecha){ + CriteriaBuilder builder = em.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(Producto.class); + Root from = query.from(Producto.class); + Predicate filtro = builder.and(); + if (nombre != null && !nombre.trim().isEmpty()) { + filtro = builder.and(filtro, builder.equal(from.get("nombre"), nombre)); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + filtro = builder.and(filtro, builder.equal(from.get("precio"), precio)); + } + if (fecha != null) { + filtro = builder.and(filtro, builder.equal(from.get("fechaDeRegistro"), fecha)); + } + query = query.where(filtro); + return em.createQuery(query).getResultList(); + } } diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java index ca3d679..999b590 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java @@ -1,46 +1,34 @@ package com.latam.alura.tienda.modelo; +import javax.persistence.EmbeddedId; import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; import javax.persistence.Table; -//public enum Categoria { -// SOFTWARES, -// LIBROS, -// CELULARES -//} @Entity @Table(name="categorias") public class Categoria { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String nombre; + //@Id + //@GeneratedValue(strategy = GenerationType.IDENTITY) + //private Long id; + //private String nombre; + + @EmbeddedId + private CategoriaId categoriaId; public Categoria() {} public Categoria(String nombre) { - this.nombre = nombre; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; + this.categoriaId = new CategoriaId(nombre, "456"); } public String getNombre() { - return nombre; + return this.categoriaId.getNombre(); } public void setNombre(String nombre) { - this.nombre = nombre; + this.categoriaId.setNombre(nombre); } } \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java new file mode 100644 index 0000000..15c655a --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java @@ -0,0 +1,59 @@ +package com.latam.alura.tienda.modelo; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Embeddable; + +@Embeddable +public class CategoriaId implements Serializable { + + private static final long serialVersionUID = -9006019453678383077L; + private String nombre; + private String password; + + public CategoriaId() {} + + public CategoriaId(String nombre, String password) { + this.nombre = nombre; + this.password = password; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public int hashCode() { + return Objects.hash(nombre, password); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CategoriaId other = (CategoriaId) obj; + return Objects.equals(nombre, other.nombre) && Objects.equals(password, other.password); + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java index 29dded1..e84f541 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java @@ -1,5 +1,6 @@ package com.latam.alura.tienda.modelo; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -14,38 +15,33 @@ public class Cliente { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String nombre; - private String dni; + @Embedded + private DatosPersonales datosPersonales; public Cliente() {} public Cliente(String nombre, String dni) { - this.nombre = nombre; - this.dni = dni; + this.datosPersonales = new DatosPersonales(nombre, dni); } - public Cliente(String nombre) { - this.nombre = nombre; - } - public Long getId() { return id; } public String getNombre() { - return nombre; + return this.datosPersonales.getNombre(); } public void setNombre(String nombre) { - this.nombre = nombre; + this.datosPersonales.setNombre(nombre); } public String getDni() { - return dni; + return this.datosPersonales.getDni(); } public void setDni(String dni) { - this.dni = dni; + this.datosPersonales.setDni(dni);; } } \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java new file mode 100644 index 0000000..314f6c9 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java @@ -0,0 +1,55 @@ +package com.latam.alura.tienda.modelo; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Embeddable; + +@Embeddable +public class DatosPersonales implements Serializable { + + private static final long serialVersionUID = 8063180201812979106L; + private String nombre; + private String dni; + + public DatosPersonales() {} + + public DatosPersonales(String nombre, String dni) { + this.nombre = nombre; + this.dni = dni; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getDni() { + return dni; + } + + public void setDni(String dni) { + this.dni = dni; + } + + @Override + public int hashCode() { + return Objects.hash(dni, nombre); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DatosPersonales other = (DatosPersonales) obj; + return Objects.equals(dni, other.dni) && Objects.equals(nombre, other.nombre); + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Electronico.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Electronico.java new file mode 100644 index 0000000..ef4f208 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Electronico.java @@ -0,0 +1,36 @@ +package com.latam.alura.tienda.modelo; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name="electronicos") +public class Electronico extends Producto { + + private String marca; + private String modelo; + + public Electronico() {} + + public Electronico(String marca, String modelo) { + this.marca = marca; + this.modelo = modelo; + } + + public String getMarca() { + return marca; + } + + public void setMarca(String marca) { + this.marca = marca; + } + + public String getModelo() { + return modelo; + } + + public void setModelo(String modelo) { + this.modelo = modelo; + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java index 594eac1..8432bc1 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java @@ -3,6 +3,7 @@ package com.latam.alura.tienda.modelo; import java.math.BigDecimal; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,9 +18,9 @@ public class ItemsPedido { private Long id; private Integer cantidad; private BigDecimal precio_unitario; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Producto producto; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Pedido pedido; public ItemsPedido() {} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Libro.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Libro.java new file mode 100644 index 0000000..805d94d --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Libro.java @@ -0,0 +1,36 @@ +package com.latam.alura.tienda.modelo; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name="libros") +public class Libro extends Producto { + + private String autor; + private Integer paginas; + + public Libro() {} + + public Libro(String autor, Integer paginas) { + this.autor = autor; + this.paginas = paginas; + } + + public String getAutor() { + return autor; + } + + public void setAutor(String autor) { + this.autor = autor; + } + + public Integer getPaginas() { + return paginas; + } + + public void setPaginas(Integer paginas) { + this.paginas = paginas; + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java index 0624156..c0302c2 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java @@ -7,6 +7,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -26,7 +27,7 @@ public class Pedido { private Long id; private LocalDate fecha = LocalDate.now(); private BigDecimal valorTotal = new BigDecimal(0); - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Cliente cliente; //@ManyToMany //@JoinTable(name="item_pedido") @@ -72,5 +73,17 @@ public class Pedido { public void setCliente(Cliente cliente) { this.cliente = cliente; } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public void setId(Long id) { + this.id = id; + } } \ No newline at end of file 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 d3059f4..00074ce 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 @@ -4,18 +4,24 @@ import java.math.BigDecimal; import java.time.LocalDate; import javax.persistence.Entity; +import javax.persistence.FetchType; //import javax.persistence.EnumType; //import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; 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") +//@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@Inheritance(strategy = InheritanceType.JOINED) public class Producto { @Id @@ -27,7 +33,7 @@ public class Producto { private BigDecimal precio; private LocalDate fechaDeRegistro = LocalDate.now(); //@Enumerated(EnumType.STRING) - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Categoria categoria; public Producto() {} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/LoadRecords.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/LoadRecords.java new file mode 100644 index 0000000..9367536 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/LoadRecords.java @@ -0,0 +1,104 @@ +package com.latam.alura.tienda.prueba; + +import java.io.File; +import java.io.FileNotFoundException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import javax.persistence.EntityManager; +import com.latam.alura.tienda.dao.CategoriaDao; +import com.latam.alura.tienda.dao.ClienteDao; +import com.latam.alura.tienda.dao.PedidoDao; +import com.latam.alura.tienda.dao.ProductoDao; +import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.Cliente; +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; + + +public class LoadRecords { + public static void cargarRegistros() throws FileNotFoundException { + EntityManager em = JPAUtils.getEntityManager(); + CategoriaDao categoriaDao = new CategoriaDao(em); + ProductoDao productoDao = new ProductoDao(em); + ClienteDao clienteDao = new ClienteDao(em); + PedidoDao pedidoDao = new PedidoDao(em); + em.getTransaction().begin(); + + loadCategoria("categoria",categoriaDao,em); + + loadProducto("producto",productoDao,categoriaDao,em); + + loadCliente("cliente",clienteDao,em); + + List clientesList = clienteDao.consultarTodos(); + List pedidoList= new ArrayList<>(); + + for(Cliente cl:clientesList) { + pedidoList.add(new Pedido(cl)); + } + + for(int i=0;i productosTxt =readFile(type); + for(int i=0;i1) { + Categoria categoria = categoriaDao.consultaPorNombre(line[3]); + Producto producto = new Producto(line[4],line[0],new BigDecimal(line[1]),categoria); + productoDao.guardar(producto); + em.flush(); + } + } + } + + private static void loadCategoria(String type, CategoriaDao categoriaDao,EntityManager em) throws FileNotFoundException { + List categoriasTxt =readFile(type); + for(int i=0;i clientesTxt =readFile(type); + for(int i=0;i1) { + Cliente cliente= new Cliente(line[0],line[1]); + clienteDao.guardar(cliente); + em.flush(); + } + } + } + + private static List readFile(String type) throws FileNotFoundException { + File file = new File("/mnt/Biblioteca/Code/guias/Java/oracle_one/cursos/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/"+type+".txt"); + Scanner scan = new Scanner(file); + List pedido= new ArrayList<>(); + while(scan.hasNextLine()){ + pedido.add(scan.nextLine()); + } + scan.close(); + return pedido; + } + + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaAPICriteria.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaAPICriteria.java new file mode 100644 index 0000000..83163c5 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaAPICriteria.java @@ -0,0 +1,54 @@ +package com.latam.alura.tienda.prueba; + +import java.math.BigDecimal; +import java.util.List; + +import javax.persistence.EntityManager; + +import com.latam.alura.tienda.dao.CategoriaDao; +import com.latam.alura.tienda.dao.ProductoDao; +import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.Producto; +import com.latam.alura.tienda.utils.JPAUtils; + +public class PruebaAPICriteria { + + public static void main(String[] args) { + + cargarBancoDeDatos(); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao =new ProductoDao(em); + + List resultado = productoDao.consultaPorParametrosConAPICriteria("X", null, null); + System.out.println(resultado.get(0).getDescripcion()); + + } + + private static void cargarBancoDeDatos() { + Categoria celulares = new Categoria("CELULARES"); + Categoria videoJuegos = new Categoria("VIDEO_JUEGOS"); + Categoria electronicos = new Categoria("ELECTRONICOS"); + + Producto celular = new Producto("X","producto nuevo",new BigDecimal(10000),celulares); + Producto videoJuego = new Producto("FIFA","2000",new BigDecimal(10000),videoJuegos); + Producto memoria = new Producto("memoria ram","30 GB",new BigDecimal(10000),electronicos); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao = new ProductoDao(em); + CategoriaDao categoriaDao = new CategoriaDao(em); + + em.getTransaction().begin(); + + categoriaDao.guardar(celulares); + categoriaDao.guardar(videoJuegos); + categoriaDao.guardar(electronicos); + + productoDao.guardar(celular); + productoDao.guardar(videoJuego); + productoDao.guardar(memoria); + + em.getTransaction().commit(); + em.close(); + } +} \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeParametros.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeParametros.java new file mode 100644 index 0000000..6cb4892 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeParametros.java @@ -0,0 +1,54 @@ +package com.latam.alura.tienda.prueba; + +import java.math.BigDecimal; +import java.util.List; + +import javax.persistence.EntityManager; + +import com.latam.alura.tienda.dao.CategoriaDao; +import com.latam.alura.tienda.dao.ProductoDao; +import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.Producto; +import com.latam.alura.tienda.utils.JPAUtils; + +public class PruebaDeParametros { + public static void main(String[] args) { + cargarBancoDeDatos(); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao =new ProductoDao(em); + + List resultado = productoDao.consultaPorParametro("FIFA", null, null); + //List resultado = productoDao.consultaPorParametro("FIFA", new BigDecimal(10000), null); + //List resultado = productoDao.consultaPorParametro("FIFA", new BigDecimal(10000), null); + + System.out.println(resultado.get(0).getDescripcion()+" - "+resultado.get(0).getFechaDeRegistro()); + } + + private static void cargarBancoDeDatos() { + Categoria celulares = new Categoria("CELULARES"); + Categoria videoJuegos = new Categoria("VIDEO_JUEGOS"); + Categoria electronicos = new Categoria("ELECTRONICOS"); + + Producto celular = new Producto("X", "producto nuevo", new BigDecimal(10000), celulares); + Producto videoJuego = new Producto("FIFA", "2000", new BigDecimal(10000), videoJuegos); + Producto memoria = new Producto("memoria ram", "30 GB", new BigDecimal(10000), electronicos); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao = new ProductoDao(em); + CategoriaDao categoriaDao = new CategoriaDao(em); + + em.getTransaction().begin(); + + categoriaDao.guardar(celulares); + categoriaDao.guardar(videoJuegos); + categoriaDao.guardar(electronicos); + + productoDao.guardar(celular); + productoDao.guardar(videoJuego); + productoDao.guardar(memoria); + + em.getTransaction().commit(); + em.close(); + } +} \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeRendimiento.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeRendimiento.java new file mode 100644 index 0000000..863ae34 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeRendimiento.java @@ -0,0 +1,30 @@ +package com.latam.alura.tienda.prueba; + +import java.io.FileNotFoundException; + +import javax.persistence.EntityManager; + +import com.latam.alura.tienda.dao.PedidoDao; +import com.latam.alura.tienda.modelo.Pedido; +import com.latam.alura.tienda.utils.JPAUtils; + +public class PruebaDeRendimiento { + + public static void main(String[] args) throws FileNotFoundException { + + LoadRecords.cargarRegistros(); + EntityManager em = JPAUtils.getEntityManager(); + + //Pedido pedido = em.find(Pedido.class, 3l); + PedidoDao pedidoDao = new PedidoDao(em); + Pedido pedidoConCliente = pedidoDao.ConsultarPedidoConCliente(2l); + + em.close(); + //System.out.println(pedido.getFecha()); + //System.out.println(pedido.getItems().size()); + //System.out.println(pedido.getCliente().getNombre()); + + System.out.println(pedidoConCliente.getCliente().getNombre()); + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java index 0805acd..a36c961 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java @@ -10,6 +10,7 @@ import javax.persistence.EntityManager; import com.latam.alura.tienda.dao.CategoriaDao; import com.latam.alura.tienda.dao.ProductoDao; import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.CategoriaId; import com.latam.alura.tienda.modelo.Producto; import com.latam.alura.tienda.utils.JPAUtils; @@ -32,76 +33,14 @@ public class RegistroDeProducto { List productos_por_nombre = productoDao.consultaPorNombre("Samsung"); productos_por_nombre.forEach(producto_ -> System.out.println(producto_.getDescripcion())); - List productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares"); - productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion())); + //List productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares"); + //productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion())); BigDecimal precio_producto = productoDao.consultaPrecioPorNombreDeProducto("Samsung"); System.out.println(precio_producto); - /* - Categoria celulares = new Categoria("Celulares"); - //Producto celular = new Producto("Samsung", "Teléfono usado", new BigDecimal("1000"), Categoria.CELULARES); - Producto celular = new Producto("Samsung", "Teléfono usado", new BigDecimal("1000"), celulares); - //celular.setNombre("Samsung"); - //celular.setDescripcion("Teléfono usado"); - //celular.setPrecio(new BigDecimal("1000")); - //EntityManagerFactory factory = Persistence.createEntityManagerFactory("tienda"); - //EntityManager em = factory.createEntityManager(); - EntityManager em = JPAUtils.getEntityManager(); - - ProductoDao productoDao = new ProductoDao(em); - CategoriaDao categoriaDao = new CategoriaDao(em); - - em.getTransaction().begin(); - categoriaDao.guardar(celulares); - productoDao.guardar(celular); - //em.persist(celular); - //em.getTransaction().commit(); - em.flush(); - em.clear(); - //em.close(); - */ - - // Acciones por aula - //em.getTransaction().begin(); - - //V1 - /* - em.getTransaction().begin(); - em.persist(celulares); - celulares.setNombre("LAPTOPS"); - em.getTransaction().commit(); - em.close(); - celulares.setNombre("PANTALLAS"); - */ - - //V2 - /* - em.persist(celulares); - celulares.setNombre("LAPTOPS"); - em.flush(); - em.clear(); - - celulares = em.merge(celulares); - celulares.setNombre("PANTALLAS"); - em.flush(); - em.remove(celulares); - */ - - //V3 - /* - em.persist(celulares); - celulares.setNombre("LAPTOPS"); - em.flush(); - em.clear(); - - celulares = em.merge(celulares); - celulares.setNombre("PANTALLAS"); - em.flush(); - //em.clear(); - em.remove(celulares); - em.flush(); - */ + Categoria find = em.find(Categoria.class, new CategoriaId("Celulares", "456")); + System.out.println(find.getNombre()); } public static void RegistrarProducto() { diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/categoria.txt b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/categoria.txt new file mode 100644 index 0000000..0340d6a --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/categoria.txt @@ -0,0 +1,8 @@ +CELULARES +LIBROS +PANTALLAS +ESTUCHES +CARGADORES +ELECTRONICOS +MONITORES +CAMARAS diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/cliente.txt b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/cliente.txt new file mode 100644 index 0000000..17e19b5 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/cliente.txt @@ -0,0 +1,8 @@ +Juan~12jb42ww +Maria~h23jb54e +Antonio~rsf32sfgt6 +Carlos~kjb3244 +Rodrigo~lkj3265lm +Gustavo~kn12hcg2 +Estefani~kjb21okp1 +Cristina~jn234k234 diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/producto.txt b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/producto.txt new file mode 100644 index 0000000..dd19d04 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/producto.txt @@ -0,0 +1,10 @@ +usado;5000;2023-03-03;CELULARES;samsun +nuevo;2500;2023-03-04;PANTALLAS;Samsung +repues;3000;2023-03-05;CELULARES;iphone +usado;1500;2023-03-06;CAMARAS;Kodak +nuevo;750;2023-03-07;PANTALLAS;Samsung +nuevo;2000;2023-03-08;CARGADORES;iphone +nuevo;3000;2023-03-09;CARGADORES;samsung +repue;1000;2023-03-10;CELULARES;samsungA20 +nuevo;3000;2023-03-09;CARGADORES;samsung +repue;1000;2023-03-10;CELULARES;samsungA20 diff --git a/010_spring_boot/jpa_avanzado.md b/010_spring_boot/jpa_avanzado.md index 2e0329a..59514b4 100644 --- a/010_spring_boot/jpa_avanzado.md +++ b/010_spring_boot/jpa_avanzado.md @@ -2,12 +2,17 @@ +- doc +[persitence](https://jakarta.ee/specifications/persistence/2.2/apidocs/javax/persistence/package-summary.html) +- Hibernate +[user guide](https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html) + Trabajando sobre el [proyecto](./jpa/tienda/src/main/java/com/latam/alura/tienda/) anterior ```mermaid erDiagram - Categorias ||--o{ Productos : tiene + Categorias ||--|{ Productos : tiene Productos { id bigint PK nombre varchar @@ -118,3 +123,192 @@ y sum**) - Consultas mediante **NamedQuerys** +Nota: +[Relaciones](https://www.adictosaltrabajo.com/2020/04/02/hibernate-onetoone-onetomany-manytoone-y-manytomany/) +en Hibernate + +### Performance en consultas + +- **LAZY** Fetch: ***Carga ondemand*** (menor utlización de recursos), todas +las anotaciones ***many*** (**ManyToOne-OneToMany**) son por defecto del tipo +**LAZY**. Al cerrar el `EntityManager` y solicitar algún dato que requiere hacer +un *select* a alguna entidad de la consulta anterior se produce una expeción. +Esto se resuelve con una **Consulta Planificada** (ej. `PedidoDao` -> +`ConsultarPedidoConCliente()`) + +- **EAGER** Fetch: ***Carga Anticipada*** (mayor utlización de recursos), todas +las anotaciones del tipo ***one*** (**OneToOne-ManyToOne**) son por defecto del +tipo **EAGER** + + +Al construir aplicaciones utilizando recursos que realizan operaciones que no +explicitas se debe estudiar la documentación para entender cual es la ciencia +detrás del framework o recurso. + +Cuando se realizan consultas con la anotación **@ManyToOne** o **@OneToOne** +por debajo, JPA aplica una estrategia de carga de información llamada **Eager** +o Anticipada o Proactiva realizando JOINS entre tablas. +Pero esto no es todo, ya que si la entidad que tiene el JOIN, tiene otras entidades +dentro de sus atributos marcados con la anotación finalizando **ToOne**, también +serán cargadas dentro de la consulta. Esto puede saturar la memoria y afectar +seriamente la velocidad de carga. Para corregir se debe utilizar el parámetro +de carga ***FerchType.LAZY*** en todas las anotaciones **ToOne**, lo que indica +a JPA cargar la entidad solo si es solicitada. + +Al realizar esta corrección se presenta un posible inconveniente donde se encontre +con la necesidad de utilizar ese atributo de entidad. +Pero para ese momento el **EntityManager** se puede encontrar cerrado, por lo que +se tienen que planear las consultas previniendo el uso de esa entidad cuando se +encuentre cerrado el **EntityManager**. + + +#### Sumario Aula 3 + +- Estrategias **EAGER** y **LAZY**, en consultas de entidades relacionadas +- JPA podría lanzar `LazyInitializationException` en ciertas situaciones +- Buenas prácticas en la carga de entidades relacionadas +- Realizar **consultas programadas** con la función de búsqueda de combinación + +### Consultas con parámetros dinámicos + +### Sin API Criteria + +ej. +[productoDAO.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java) + +```java + public List consultaPorParametro(String nombre, BigDecimal precio, LocalDate fecha){ + StringBuilder jpql = new StringBuilder("SELECT P FROM Producto P WHERE 1=1"); + if (nombre != null && !nombre.trim().isEmpty()) { + jpql.append(" AND P.nombre=:nombre"); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + jpql.append(" AND P.precio=:precio"); + } + if (fecha != null) { + jpql.append(" AND P.fechaDeRegistro=:fecha"); + } + TypedQuery query = em.createQuery(jpql.toString(), Producto.class); + if (nombre != null && !nombre.trim().isEmpty()) { + query.setParameter("nombre", nombre); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + query.setParameter("precio", precio); + } + if (fecha != null) { + query.setParameter("fechaDeRegistro", fecha); + } + return query.getResultList(); + } +``` + +### Con API Criteria + +```java + public List consultaPorParametrosConAPICriteria(String nombre, BigDecimal precio, LocalDate fecha){ + CriteriaBuilder builder = em.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(Producto.class); + Root from = query.from(Producto.class); + Predicate filtro = builder.and(); + if (nombre != null && !nombre.trim().isEmpty()) { + filtro = builder.and(filtro, builder.equal(from.get("nombre"), nombre)); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + filtro = builder.and(filtro, builder.equal(from.get("precio"), precio)); + } + if (fecha != null) { + filtro = builder.and(filtro, builder.equal(from.get("fechaDeRegistro"), fecha)); + } + query = query.where(filtro); + return em.createQuery(query).getResultList(); + } +} +``` + +#### Sumario Aula 4 + +- Consultas JPQL con parámetros opcionales +- API de criterios JPA y consulta con parámetros opcionales + +## Embeddable + +Simplificación de entidades con anotaciones `@Embeddable` y `@Embedded`, ejm. +[Cliente.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java) +y +[DatosPersonales.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java) + +## Mapeo de herencias + +### Join table + + + +#### Estrategia Single Table + +Una única tabla, ejm. +[Producto.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java) + +```java +... +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +public class Producto { + ... +``` + +```mermaid +erDiagram + Productos + Productos { + id bigint PK + nombre varchar + descripcion varchar + precio decimal + categoria_id bigint FK + fecha_registro date + autor varchar + paginas int + marca varchar + modelo varchar + } +``` + +#### Estrategia Joined Table + +ejm. +[Producto.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java) + +```java +... +@Inheritance(strategy = InheritanceType.JOINED) +public class Producto { + ... +``` + +```mermaid +erDiagram + Electronicos + Productos + Electronicos { + id bigint PK + marca varchar + modelo varchar + } + Productos { + id bigint PK + nombre varchar + descripcion varchar + precio decimal + fecha_registro date + } + Libros { + id biging PK + autor varchar + paginas int + } +``` + +## Mapeo de llaves compuestas + +ejm. +[Categoria.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java) +[CategoriaId.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java)