Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Professor tenho uma duvida, pode me ajuda?

Sempre dei prioridade a rapidez e agilidade em sistema, site, etc... Sempre estudei e tentei ver a melhor maneira do ocorrido, porem nunca tinha percebido isso do select, alias até tinha, mais na verdade nunca tinha entendido o procedimento da operação lazzy, e realmente, faz 2 select no banco de dados, primeiro retorna os livros e depois os autor, penso em uma aplicação grande, e bastante de gente usando, o quanto ia ser prejudicial.

Porem eu também sempre usei o CDI, para cuidar das minhas transação e instanciar objetos e todas as vantagens que ele nos traz.

Iniciei o curso com você, mais não uso as ferramentas que você usa, por exemplo uso tomcat, to usando CDI para minhas transação, algumas coisas diferentes.

Fiz os 2 metodos um do proprio EntntyManager.

public Livro buscarLivroPorCodido(Long codigo) {
        return manager.find(Livro.class, codigo);
    }

e outro personalizado.

public Livro buscar(Long codigo) {
        return manager.createQuery("SELECT l FROM Livro AS l INNER JOIN l.autores AS a"
                + " WHERE l.codigo = :pCodigo", Livro.class).setParameter("pCodigo", codigo).getSingleResult();
    }

Mais o retorno do meu select foram os mesmo, os 2 estão indo no banco 2 veses, queria que o meu buscar, fosse apenas 1 e ja retornasse o meu livros com os autores, oque que pode ser? Alguma coisa do CDI?.

meu EntityManager...


@SuppressWarnings("serial")
public class LivroDao implements Serializable{

    @Inject
    private EntityManager manager;

E meu console do resultado :(

Hibernate: select livro0_.codigo as codigo1_1_, livro0_.capaPath as capaPath2_1_, livro0_.dataLancamento as dataLanc3_1_, livro0_.descricao as descrica4_1_, livro0_.numeroPaginas as numeroPa5_1_, livro0_.titulo as titulo6_1_, livro0_.valor as valor7_1_ from Livro livro0_ inner join Livro_Autor autores1_ on livro0_.codigo=autores1_.Livro_codigo inner join Autor autor2_ on autores1_.autores_codigo=autor2_.codigo where livro0_.codigo=?
Hibernate: select autores0_.Livro_codigo as Livro_co1_2_0_, autores0_.autores_codigo as autores_2_2_0_, autor1_.codigo as codigo1_0_1_, autor1_.nome as nome2_0_1_ from Livro_Autor autores0_ inner join Autor autor1_ on autores0_.autores_codigo=autor1_.codigo where autores0_.Livro_codigo=?
4 respostas
solução

Olá, Alisson!

Você pode usar um JOIN FETCH para fazer com que, em uma query, você já obtenha os resultados de um relacionamento @OneToMany ou @ManyToMany:

SELECT l FROM Livro AS l INNER JOIN FETCH l.autores AS a  WHERE l.codigo = :pCodigo

A aula 4 do curso "Java e JPA: Otimizações com JPA2 e Hibernate" explica com calma o JOIN FETCH.

Opa!

Muito bom :) alterei para JOIN FETCH e me retornou apenas.

Hibernate: select livro0_.codigo as codigo1_1_0_, autor2_.codigo as codigo1_0_1_, livro0_.capaPath as capaPath2_1_0_, livro0_.dataLancamento as dataLanc3_1_0_, livro0_.descricao as descrica4_1_0_, livro0_.numeroPaginas as numeroPa5_1_0_, livro0_.titulo as titulo6_1_0_, livro0_.valor as valor7_1_0_, autor2_.nome as nome2_0_1_, autores1_.Livro_codigo as Livro_co1_2_0__, autores1_.autores_codigo as autores_2_2_0__ from Livro livro0_ inner join Livro_Autor autores1_ on livro0_.codigo=autores1_.Livro_codigo inner join Autor autor2_ on autores1_.autores_codigo=autor2_.codigo where livro0_.codigo=?

Muito obrigado, então o JOIN FETCH já faz com que faça apenas uma busca no banco trazendo suas fk. Muito bom saber man. vlw

Alisson,

Vale ressaltar que os livros que tem mais de um autor virão repetidos. Tem a ver com a maneira como o BD retorna os dados, porque tudo vem numa query só...

É importante colocar um DISTINCT, conforme abaixo:

SELECT DISTINCT l FROM Livro AS l INNER JOIN FETCH l.autores AS a  WHERE l.codigo = :pCodigo

Certo mano, vlw