JPA Consultas avanzadas...: FIN
This commit is contained in:
parent
fdb82ae7f9
commit
1ccd4f5e18
@ -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)
|
||||
|
Binary file not shown.
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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);;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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() {}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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() {}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
@ -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() {
|
||||
|
@ -0,0 +1,8 @@
|
||||
CELULARES
|
||||
LIBROS
|
||||
PANTALLAS
|
||||
ESTUCHES
|
||||
CARGADORES
|
||||
ELECTRONICOS
|
||||
MONITORES
|
||||
CAMARAS
|
@ -0,0 +1,8 @@
|
||||
Juan~12jb42ww
|
||||
Maria~h23jb54e
|
||||
Antonio~rsf32sfgt6
|
||||
Carlos~kjb3244
|
||||
Rodrigo~lkj3265lm
|
||||
Gustavo~kn12hcg2
|
||||
Estefani~kjb21okp1
|
||||
Cristina~jn234k234
|
@ -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
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user