JPA Consultas avanzadas...: FIN

This commit is contained in:
devfzn 2023-09-07 15:05:10 -03:00
parent fdb82ae7f9
commit 1ccd4f5e18
Signed by: devfzn
GPG Key ID: E070ECF4A754FDB1
23 changed files with 757 additions and 106 deletions

View File

@ -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)

View File

@ -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<Categoria> consultarTodos() {
String jpql = "SELECT P FROM Categoria AS P";
return em.createQuery(jpql, Categoria.class).getResultList();

View File

@ -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();
}
}

View File

@ -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<Producto> 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<Producto> 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<Producto> consultaPorParametrosConAPICriteria(String nombre, BigDecimal precio, LocalDate fecha){
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Producto> query = builder.createQuery(Producto.class);
Root<Producto> 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();
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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);;
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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() {}

View File

@ -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;
}
}

View File

@ -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<ItemsPedido> getItems() {
return items;
}
public void setItems(List<ItemsPedido> items) {
this.items = items;
}
public void setId(Long id) {
this.id = id;
}
}

View File

@ -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() {}

View File

@ -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<Cliente> clientesList = clienteDao.consultarTodos();
List<Pedido> pedidoList= new ArrayList<>();
for(Cliente cl:clientesList) {
pedidoList.add(new Pedido(cl));
}
for(int i=0;i<pedidoList.size();i++) {
pedidoList.get(i).agregarItems(new ItemsPedido(i+1,productoDao.consultaPorId((long) (i+1)),pedidoList.get(i)));
pedidoDao.guardar(pedidoList.get(i));
}
em.getTransaction().commit();
em.close();
}
private static void loadProducto(String type, ProductoDao productoDao,CategoriaDao categoriaDao, EntityManager em) throws FileNotFoundException {
List<String> productosTxt =readFile(type);
for(int i=0;i<productosTxt.size();i++) {
String[] line = productosTxt.get(i).split(";");
if(line.length>1) {
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<String> categoriasTxt =readFile(type);
for(int i=0;i<categoriasTxt.size();i++) {
String[] line = categoriasTxt.get(i).split(";");
if(line.length==1) {
Categoria categoria = new Categoria(categoriasTxt.get(i));
categoriaDao.guardar(categoria);
em.flush();
}
}
}
private static void loadCliente(String type, ClienteDao clienteDao,EntityManager em) throws FileNotFoundException {
List<String> clientesTxt =readFile(type);
for(int i=0;i<clientesTxt.size();i++) {
String[] line = clientesTxt.get(i).split("~");
System.out.println(line[0]+line[1]);
if(line.length>1) {
Cliente cliente= new Cliente(line[0],line[1]);
clienteDao.guardar(cliente);
em.flush();
}
}
}
private static List<String> 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<String> pedido= new ArrayList<>();
while(scan.hasNextLine()){
pedido.add(scan.nextLine());
}
scan.close();
return pedido;
}
}

View File

@ -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<Producto> 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();
}
}

View File

@ -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<Producto> resultado = productoDao.consultaPorParametro("FIFA", null, null);
//List<Producto> resultado = productoDao.consultaPorParametro("FIFA", new BigDecimal(10000), null);
//List<Producto> 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();
}
}

View File

@ -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());
}
}

View File

@ -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<Producto> productos_por_nombre = productoDao.consultaPorNombre("Samsung");
productos_por_nombre.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
List<Producto> productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares");
productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
//List<Producto> 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() {

View File

@ -0,0 +1,8 @@
CELULARES
LIBROS
PANTALLAS
ESTUCHES
CARGADORES
ELECTRONICOS
MONITORES
CAMARAS

View File

@ -0,0 +1,8 @@
Juan~12jb42ww
Maria~h23jb54e
Antonio~rsf32sfgt6
Carlos~kjb3244
Rodrigo~lkj3265lm
Gustavo~kn12hcg2
Estefani~kjb21okp1
Cristina~jn234k234

View File

@ -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

View File

@ -2,12 +2,17 @@
<style>div.mermaid{text-align: center;}</style>
- 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<Producto> 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<Producto> 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<Producto> consultaPorParametrosConAPICriteria(String nombre, BigDecimal precio, LocalDate fecha){
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Producto> query = builder.createQuery(Producto.class);
Root<Producto> 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)