1
resposta

List dentro do foreach executa uma consulta no banco em cada interação?

package br.com.financas.teste;

import java.util.List;

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

import br.com.financas.model.Conta;
import br.com.financas.modelo.util.JPAUtil;

public class TesteMovimentacaoConta {

    /**
     * @param args
     */
    public static void main(String[] args) {
        EntityManager em = new JPAUtil().getEntityManager();

        Conta conta1 = em.find(Conta.class, 1);
        System.out.println(conta1.getMovimentacoes().size());

        String jpql = "select c from Conta c join fetch c.movimentacoes where c.id = 1";

        Query query = em.createQuery(jpql);

        List<Conta> todasAsContas = query.getResultList();
        for (Conta conta : todasAsContas) {
            System.out.println("Titular: " + conta.getTitular());
            System.out.println("Movimentacoes: ");
            System.out.println(conta.getMovimentacoes());
        }
    }
}

em cada iteracao dentro do foreach percebi que esta sendo realizada uma nova consulta no banco seguindo o N+1, porém na minha query estou utilizando o mesmo exemplo da aula. alguma explicação para tal ocorrido ou solução ?

1 resposta

package br.com.financas.teste;

import java.util.List;

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

import br.com.financas.model.Conta; import br.com.financas.modelo.util.JPAUtil;

public class TesteMovimentacaoConta {

/**
 * @param args
 */
public static void main(String[] args) {
    EntityManager em = new JPAUtil().getEntityManager();

    Conta conta1 = em.find(Conta.class, 1);
    System.out.println(conta1.getMovimentacoes().size());

    String jpql = "select c from Conta c join fetch c.movimentacoes where c.id = 1";

    Query query = em.createQuery(jpql);

    List<Conta> todasAsContas = query.getResultList();
    for (Conta conta : todasAsContas) {
        System.out.println("Titular: " + conta.getTitular());
        System.out.println("Movimentacoes: ");
        System.out.println(conta.getMovimentacoes());
    }
}

}

insira seu código aqui