Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Utilizando o join fetch na query o resultado não foi o esperado. (Reflexão sobre a dúvida já resolvida)

Vendo o tópico no fórum, constatei que possuia a mesma dúvida. Por quê o retorno da consulta me trazia Contas repetidas?

Consegui chegar ao entendimento, quando realizamos o join, retornamos a conta repetidamente de acordo com o número de movimentações a que ela esteja associada. Isto acontece quando executamos um sql direto no banco também.

Porém a solução que foi dada no tópico era de se usar distinct na consulta, e realmente funcionou. Porém eis a minha dúvida....

Por quê quando executo a jpql com distinct, ela me traz os dados sem se repetir e quando executo o sql com distinct direto no banco os dados continuam se repetindo?

O que ocorre de diferente na jpql para que ela consiga trazer os dados sem repetição?

4 respostas

Olá Anderson!

Poderia me enviar o comando SQL que você fez por favor?

Boa noite Guilherme.

Segue o código java.

package br.com.caelum.financas.teste;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import br.com.caelum.financas.modelo.Conta;
import br.com.caelum.financas.modelo.Movimentacao;
import br.com.caelum.financas.util.JPAUtil;

public class TesteTodasAsMovimentacoesDasContas {

    public static void main(String[] args) {

        String jpql insira seu código aqui= "Select distinct(c) from Conta c join fetch c.movimentacoes";


        EntityManager em = new JPAUtil().getEntityManager();

        em.getTransaction().begin();

        Query query = em.createQuery(jpql); 

        List<Conta> contas = query.getResultList(); 

        System.out.println("Quantidade de Contas: "+ contas.size());


        for (Conta conta : contas) {

            System.out.println("Titular: "+ conta.getTitular());

            for (Movimentacao movimentacao : conta.getMovimentacoes()) {

                System.out.println("Movimentação: "+ movimentacao.getDescricao());

            }

        }

        em.getTransaction().commit();
        em.close();


    }

}

Agora o código executado no mysql.

select distinct * from Conta c join Movimentacao m on (c.id = m.conta_id);
solução!

Boa noite.

Tenho uma suposição em relação ao porquê da consulta com distinct funcionar na jpql e no sql do mysql não.

Quando digito "Select c from Conta c", seria o equivalente a estar fazendo um select buscando todos os campos da tabela Conta, mesmo que eu faça o join com Movimentacao, ainda assim ele estará trazendo somente os dados da tabela Conta.

Quando executo a query no mysql:

select * from Conta c join Movimentacao m on (c.id = m.conta_id);

O "*" indica que eu estou buscando todos os dados de Conta e Movimentação.

Devido esta diferença, quando executo a query no jpql com distinct, temos o resultado esperado, pois só trazemos os dados da Conta, enquanto que no sql padrão, o resultado não é o esperado pois trazemos os dados de Conta e Movimentação.

Gostaria de saber se esta minha suposição está correta.

Olá Anderson!

Está correta sim! Vou marcar seu comentário como solução do tópico.

Obrigado por compartilhar conosco!

Abs, bons estudos!