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)
|
- [Curso](https://app.aluracursos.com/course/introduccion-sql-mysql-manipule-consulte-datos)
|
||||||
Java y [bases de datos](./base_de_datos.md)
|
Java y [bases de datos](./base_de_datos.md)
|
||||||
- Lectura [JDBC](https://www.aluracursos.com/blog/conociendo-el-jdbc)
|
- 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)
|
- [Curso](https://app.aluracursos.com/course/java-jdbc-trabajando-base-datos)
|
||||||
Java y [JDBC](./jdbc.md)
|
Java y [JDBC](./jdbc.md)
|
||||||
- [Curso](https://app.aluracursos.com/course/persistencia-jpa-hibernate)
|
- [Curso](https://app.aluracursos.com/course/persistencia-jpa-hibernate)
|
||||||
Persistencia con [JPA - Hibernate](./jpa_persistencia_hibernate.md)
|
Persistencia con [JPA - Hibernate](./jpa_persistencia_hibernate.md)
|
||||||
- [Curso](https://app.aluracursos.com/course/java-jpa-consultas-avanzadas-rendimiento-modelos-complejos)
|
- [Curso](https://app.aluracursos.com/course/java-jpa-consultas-avanzadas-rendimiento-modelos-complejos)
|
||||||
JPA [consultas avanzadas, rendimiento y modelos complejos](./jpa_avanzado.md)
|
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);
|
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() {
|
public List<Categoria> consultarTodos() {
|
||||||
String jpql = "SELECT P FROM Categoria AS P";
|
String jpql = "SELECT P FROM Categoria AS P";
|
||||||
return em.createQuery(jpql, Categoria.class).getResultList();
|
return em.createQuery(jpql, Categoria.class).getResultList();
|
||||||
|
@ -84,4 +84,9 @@ public class PedidoDao {
|
|||||||
return em.createQuery(jpql, ReporteDeVenta.class).getResultList();
|
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;
|
package com.latam.alura.tienda.dao;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.persistence.EntityManager;
|
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;
|
import com.latam.alura.tienda.modelo.Producto;
|
||||||
|
|
||||||
@ -50,4 +56,46 @@ public class ProductoDao {
|
|||||||
public BigDecimal consultaPrecioPorNombreDeProducto(String nombre) {
|
public BigDecimal consultaPrecioPorNombreDeProducto(String nombre) {
|
||||||
return em.createNamedQuery("Producto.consultaDePrecio", BigDecimal.class).setParameter("nombre", nombre).getSingleResult();
|
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;
|
package com.latam.alura.tienda.modelo;
|
||||||
|
|
||||||
|
import javax.persistence.EmbeddedId;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
|
||||||
import javax.persistence.GenerationType;
|
|
||||||
import javax.persistence.Id;
|
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
//public enum Categoria {
|
|
||||||
// SOFTWARES,
|
|
||||||
// LIBROS,
|
|
||||||
// CELULARES
|
|
||||||
//}
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name="categorias")
|
@Table(name="categorias")
|
||||||
public class Categoria {
|
public class Categoria {
|
||||||
|
|
||||||
@Id
|
//@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
//@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
private Long id;
|
//private Long id;
|
||||||
private String nombre;
|
//private String nombre;
|
||||||
|
|
||||||
|
@EmbeddedId
|
||||||
|
private CategoriaId categoriaId;
|
||||||
|
|
||||||
public Categoria() {}
|
public Categoria() {}
|
||||||
|
|
||||||
public Categoria(String nombre) {
|
public Categoria(String nombre) {
|
||||||
this.nombre = nombre;
|
this.categoriaId = new CategoriaId(nombre, "456");
|
||||||
}
|
|
||||||
|
|
||||||
public Long getId() {
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setId(Long id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getNombre() {
|
public String getNombre() {
|
||||||
return nombre;
|
return this.categoriaId.getNombre();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNombre(String nombre) {
|
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;
|
package com.latam.alura.tienda.modelo;
|
||||||
|
|
||||||
|
import javax.persistence.Embedded;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
@ -14,18 +15,13 @@ public class Cliente {
|
|||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
private Long id;
|
private Long id;
|
||||||
private String nombre;
|
@Embedded
|
||||||
private String dni;
|
private DatosPersonales datosPersonales;
|
||||||
|
|
||||||
public Cliente() {}
|
public Cliente() {}
|
||||||
|
|
||||||
public Cliente(String nombre, String dni) {
|
public Cliente(String nombre, String dni) {
|
||||||
this.nombre = nombre;
|
this.datosPersonales = new DatosPersonales(nombre, dni);
|
||||||
this.dni = dni;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Cliente(String nombre) {
|
|
||||||
this.nombre = nombre;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Long getId() {
|
public Long getId() {
|
||||||
@ -33,19 +29,19 @@ public class Cliente {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String getNombre() {
|
public String getNombre() {
|
||||||
return nombre;
|
return this.datosPersonales.getNombre();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setNombre(String nombre) {
|
public void setNombre(String nombre) {
|
||||||
this.nombre = nombre;
|
this.datosPersonales.setNombre(nombre);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDni() {
|
public String getDni() {
|
||||||
return dni;
|
return this.datosPersonales.getDni();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setDni(String dni) {
|
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 java.math.BigDecimal;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
@ -17,9 +18,9 @@ public class ItemsPedido {
|
|||||||
private Long id;
|
private Long id;
|
||||||
private Integer cantidad;
|
private Integer cantidad;
|
||||||
private BigDecimal precio_unitario;
|
private BigDecimal precio_unitario;
|
||||||
@ManyToOne
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
private Producto producto;
|
private Producto producto;
|
||||||
@ManyToOne
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
private Pedido pedido;
|
private Pedido pedido;
|
||||||
|
|
||||||
public ItemsPedido() {}
|
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.CascadeType;
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
@ -26,7 +27,7 @@ public class Pedido {
|
|||||||
private Long id;
|
private Long id;
|
||||||
private LocalDate fecha = LocalDate.now();
|
private LocalDate fecha = LocalDate.now();
|
||||||
private BigDecimal valorTotal = new BigDecimal(0);
|
private BigDecimal valorTotal = new BigDecimal(0);
|
||||||
@ManyToOne
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
private Cliente cliente;
|
private Cliente cliente;
|
||||||
//@ManyToMany
|
//@ManyToMany
|
||||||
//@JoinTable(name="item_pedido")
|
//@JoinTable(name="item_pedido")
|
||||||
@ -73,4 +74,16 @@ public class Pedido {
|
|||||||
this.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 java.time.LocalDate;
|
||||||
|
|
||||||
import javax.persistence.Entity;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.FetchType;
|
||||||
//import javax.persistence.EnumType;
|
//import javax.persistence.EnumType;
|
||||||
//import javax.persistence.Enumerated;
|
//import javax.persistence.Enumerated;
|
||||||
import javax.persistence.GeneratedValue;
|
import javax.persistence.GeneratedValue;
|
||||||
import javax.persistence.GenerationType;
|
import javax.persistence.GenerationType;
|
||||||
import javax.persistence.Id;
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Inheritance;
|
||||||
|
import javax.persistence.InheritanceType;
|
||||||
import javax.persistence.ManyToOne;
|
import javax.persistence.ManyToOne;
|
||||||
import javax.persistence.NamedQuery;
|
import javax.persistence.NamedQuery;
|
||||||
import javax.persistence.Table;
|
import javax.persistence.Table;
|
||||||
|
|
||||||
|
|
||||||
@Entity
|
@Entity
|
||||||
@Table(name="productos")
|
@Table(name="productos")
|
||||||
@NamedQuery(name="Producto.consultaDePrecio", query="SELECT P.precio FROM Producto AS P WHERE P.nombre=:nombre")
|
@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 {
|
public class Producto {
|
||||||
|
|
||||||
@Id
|
@Id
|
||||||
@ -27,7 +33,7 @@ public class Producto {
|
|||||||
private BigDecimal precio;
|
private BigDecimal precio;
|
||||||
private LocalDate fechaDeRegistro = LocalDate.now();
|
private LocalDate fechaDeRegistro = LocalDate.now();
|
||||||
//@Enumerated(EnumType.STRING)
|
//@Enumerated(EnumType.STRING)
|
||||||
@ManyToOne
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
private Categoria categoria;
|
private Categoria categoria;
|
||||||
|
|
||||||
public Producto() {}
|
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.CategoriaDao;
|
||||||
import com.latam.alura.tienda.dao.ProductoDao;
|
import com.latam.alura.tienda.dao.ProductoDao;
|
||||||
import com.latam.alura.tienda.modelo.Categoria;
|
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.modelo.Producto;
|
||||||
import com.latam.alura.tienda.utils.JPAUtils;
|
import com.latam.alura.tienda.utils.JPAUtils;
|
||||||
|
|
||||||
@ -32,76 +33,14 @@ public class RegistroDeProducto {
|
|||||||
List<Producto> productos_por_nombre = productoDao.consultaPorNombre("Samsung");
|
List<Producto> productos_por_nombre = productoDao.consultaPorNombre("Samsung");
|
||||||
productos_por_nombre.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
|
productos_por_nombre.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
|
||||||
|
|
||||||
List<Producto> productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares");
|
//List<Producto> productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares");
|
||||||
productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
|
//productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion()));
|
||||||
|
|
||||||
BigDecimal precio_producto = productoDao.consultaPrecioPorNombreDeProducto("Samsung");
|
BigDecimal precio_producto = productoDao.consultaPrecioPorNombreDeProducto("Samsung");
|
||||||
System.out.println(precio_producto);
|
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");
|
Categoria find = em.find(Categoria.class, new CategoriaId("Celulares", "456"));
|
||||||
//EntityManager em = factory.createEntityManager();
|
System.out.println(find.getNombre());
|
||||||
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();
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void RegistrarProducto() {
|
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>
|
<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/)
|
Trabajando sobre el [proyecto](./jpa/tienda/src/main/java/com/latam/alura/tienda/)
|
||||||
anterior
|
anterior
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
erDiagram
|
erDiagram
|
||||||
Categorias ||--o{ Productos : tiene
|
Categorias ||--|{ Productos : tiene
|
||||||
Productos {
|
Productos {
|
||||||
id bigint PK
|
id bigint PK
|
||||||
nombre varchar
|
nombre varchar
|
||||||
@ -118,3 +123,192 @@ y sum**)
|
|||||||
- Consultas mediante **NamedQuerys**
|
- 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