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

Dúvida na estrutura do código N + 1 e EAGER - Aula 7 Exercício 3

Segue o código abaixo:

package br.com.alura.financas.teste;

import java.util.List;

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

import br.com.alura.financas.models.Conta;
import br.com.alura.financas.models.Movimentacao;
import br.com.alura.financas.util.JPAUtil;

public class TesteInserirMovimentacao {

    public static void main(String[] args) {

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

        Query query = em.createQuery("select c from Conta c join fetch c.movimentacoes");

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

        for (Conta conta : listConta) {
            System.out.println("Conta: " + conta.getTitular());
            System.out.println("Movimentações: " + conta.getMovimentacoes());
        }

        em.close();
    }

}

Boa Tarde senhores,

Estou na aula 7 do curso de JPA exercício 3 e foi dado este exercício. Gostaria de imprimir o nome da descrição das movimentações feitas de cada conta. Ao invés disso, aparece o resultado abaixo:

Hibernate: 
    select
        conta0_.id as id0_0_,
        movimentac1_.id as id1_1_,
        conta0_.agencia as agencia0_0_,
        conta0_.banco as banco0_0_,
        conta0_.numero as numero0_0_,
        conta0_.titular as titular0_0_,
        movimentac1_.conta_id as conta6_1_1_,
        movimentac1_.data as data1_1_,
        movimentac1_.descricao as descricao1_1_,
        movimentac1_.tipoMovimentacao as tipoMovi4_1_1_,
        movimentac1_.valor as valor1_1_,
        movimentac1_.conta_id as conta6_0_0__,
        movimentac1_.id as id1_0__ 
    from
        Conta conta0_ 
    inner join
        Movimentacao movimentac1_ 
            on conta0_.id=movimentac1_.conta_id
Conta: Paulo Roberto Souza
Movimentações: [br.com.alura.financas.models.Movimentacao@51549490, br.com.alura.financas.models.Movimentacao@7d446ed1]
Conta: Paulo Roberto Souza
Movimentações: [br.com.alura.financas.models.Movimentacao@51549490, br.com.alura.financas.models.Movimentacao@7d446ed1]

Muito obrigado pela atenção, Rafael

2 respostas

Olá, Rafael!

Como a Conta tem um List<Movimentacao>, ao fazer:

System.out.println("Movimentações: " + conta.getMovimentacoes());

é impresso o List com um [ no começo e ] no final. No meio, ficam os toString das movimentações.

Como o toString não está sobreescrito, é mostrado o nome completo da classe, com o pacote, seguido de um @ e o hasCode do objeto.

Sobreescreva o toString para mostrar a descrição da Movimentação:


@Entity
public class Movimentacao {

    //demais atributos e métodos...

    public String toString() {
        return "Movimentacao: " + descricao;
    }
}

Você pode colocar também a data, o tipo da movimentação e o valor.

solução!

Boa Tarde Alexandre,

Era isso mesmo, tinha esquecido de sobrescrever o método toString() que segue abaixo:

    public String toString() {
        String texto = "Movimentação: " + this.descricao + 
                       " Data: " + JPAUtil.formatDate(this.data) + 
                       " Tipo da Movimentacao: " + this.tipoMovimentacao + "\n" ; 
        return texto;
    }

E ainda por cima utilizei a claúsula distinct no jpql na classe de teste TesteTodasAsMovimentacoesDasContas que segue abaixo:

select distinct(c) from Conta c join fetch c.movimentacoes

Com isso, você explicou a minha dúvida, pois achava que tinha que criar um método aonde passava por parâmetro um tipo inteiro e chamava ele a cada iteração dentro do loop foreach. Assim é mais fácil kkk.

Muito obrigado pela ajuda, Rafael