Ola,
Quando consultamos por um pedido usando join fetch com cliente, os items estao disponiveis no resultado da querie, porque? Seria por causa do JPA perceber o relacionamento de um pedido contem varios itens, e o pedido ser o pk da relacao e ele estar sendo carregado... Ou nao tem relacao ?
Fiquei com essa duvida, como os items do pedido retornaram ali.
SELECT JOIN FETCH
Hibernate:
select
pedido0_.id as id1_3_0_,
cliente1_.id as id1_1_1_,
pedido0_.cliente_id as cliente_4_3_0_,
pedido0_.data_cadastro as data_cad2_3_0_,
pedido0_.valor_total as valor_to3_3_0_,
cliente1_.cpf as cpf2_1_1_,
cliente1_.nome as nome3_1_1_
from
pedidos pedido0_
inner join
clientes cliente1_
on pedido0_.cliente_id=cliente1_.id
where
pedido0_.id=?
Pedido{id=1, dataCadastro=2023-04-25, valorTotal=22500.00, cliente=Cliente{id=1, nome='Eduardo', cpf='12345678901'}, itens=[ItemPedido{quantidade=10precoUnitario=1500.00}, ItemPedido{quantidade=5precoUnitario=1500.00}]}
Pedido
package br.com.alura.loja.modelo;
import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
@Entity
@Table(name="pedidos")
public class Pedido {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name="data_cadastro")
private LocalDate dataCadastro = LocalDate.now();
@Column(name="valor_total")
private BigDecimal valorTotal = BigDecimal.ZERO;
@ManyToOne(fetch = FetchType.LAZY)
private Cliente cliente;
@OneToMany(mappedBy="pedido", cascade = CascadeType.ALL)
private List<ItemPedido> itens = new ArrayList<ItemPedido>();
public Pedido() {}
public Pedido(Cliente cliente) {
this.cliente = cliente;
}
public void adicionarItem(ItemPedido itemPedido) {
itemPedido.setPedido(this);
BigDecimal valorTotalDeItems = itemPedido.getPrecoTotal();
this.valorTotal = this.valorTotal.add(valorTotalDeItems);
this.itens.add(itemPedido);
}
@Override
public String toString() {
return "Pedido{" +
"id=" + id +
", dataCadastro=" + dataCadastro +
", valorTotal=" + valorTotal +
", cliente=" + cliente +
", itens=" + itens +
'}';
}
public Collection<Object> getItems() {
return Collections.unmodifiableCollection(this.itens);
}
public String getCliente() {
return this.cliente.toString();
}
}
ItemPedido
package br.com.alura.loja.modelo;
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
@Table(name="itens_pedido")
public class ItemPedido {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "preco_unitario")
private BigDecimal precoUnitario;
private int quantidade;
@ManyToOne(fetch = FetchType.LAZY)
private Pedido pedido;
@ManyToOne(fetch = FetchType.LAZY)
private Produto produto;
public ItemPedido() {}
public ItemPedido(int quantidade, Produto produto, Pedido pedido) {
this.quantidade = quantidade;
this.produto = produto;
this.precoUnitario = produto.getPreco();
this.pedido = pedido;
}
public void setPedido(Pedido pedido) {
this.pedido = pedido;
}
public BigDecimal getPrecoTotal() {
return new BigDecimal(this.quantidade).multiply(this.precoUnitario);
}
@Override
public String toString() {
return "ItemPedido{" +
"quantidade=" + quantidade +
"precoUnitario=" + precoUnitario +
'}';
}
}