1
resposta

No meu caso qual seria a opção mais rapida?

Boa tarde, tenho uma duvida, estou fazendo o curso de jpa com hibernate, e vi se eu não usar o JOIN fetch o hibernate busca automaticamente as tabelas relacionadas da consulta, como por exemplo.

@Entity
public class Venda {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private BigDecimal valorTotal;
    private LocalDate dataVenda;

    @OneToOne
    @JoinColumn(name = "cliente_id")
    private Cliente cliente;

    @ManyToMany
    @JoinColumn(name = "produto_id")
    private List<Produto> produtos;
List<Venda> vendas = manager.createQuery("SELECT v FROM Venda v", Venda.class).getResultList();

Se eu fizer um select dessa maneira o meu resultado do console é o seguinte.

Hibernate: select venda0_.id as id1_4_, venda0_.cliente_id as cliente_4_4_, venda0_.dataVenda as dataVend2_4_, venda0_.valorTotal as valorTot3_4_ from Venda venda0_
Hibernate: select cliente0_.id as id1_0_0_, cliente0_.cpf as cpf2_0_0_, cliente0_.idade as idade3_0_0_, cliente0_.nome as nome4_0_0_ from Cliente cliente0_ where cliente0_.id=?

Aqui deu 2 select sendo que só busquei a minha venda, então se eu pensar em performance em um sistema, aqui está fazendo 2 busca no meu banco de dados, oque eu acho que não é uma boa coisa né? Se eu usar o JOIN FETCH

List<Venda> vendas = manager.createQuery("SELECT v FROM Venda v JOIN FETCH v.cliente c", Venda.class).getResultList();

o console é o seguinte.

Hibernate: select venda0_.id as id1_4_0_, cliente1_.id as id1_0_1_, venda0_.cliente_id as cliente_4_4_0_, venda0_.dataVenda as dataVend2_4_0_, venda0_.valorTotal as valorTot3_4_0_, cliente1_.cpf as cpf2_0_1_, cliente1_.idade as idade3_0_1_, cliente1_.nome as nome4_0_1_ from Venda venda0_ inner join Cliente cliente1_ on venda0_.cliente_id=cliente1_.id

Aqui percebi que ele fez o inner join e fez apenas uma busca no meu banco, claro que meu banco de dados é pequeno então das 2 maneira foi rapido o select, pensando em um banco em produção mesmo com uma lista grande, nesse caso, qual seria a melhor opção? A segunda certo?

1 resposta

Otimização prematura é a raiz de todos os males -Donald Knuth Num ambiente de produção, as queries mais pesadas vão ser feitas usando SQL puro com jdbc, ou até mesmo stored procedures dentro do próprio SGBD.Para fins didáticos, é importante entender a mecanica do ORM, e entender onde esse paradigma possa virar um gargalo.