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

Dúvida no Ex. 10 da Aula 6 - Relacionamentos bidirecionais e o comportamento LAZY

Boa Tarde,

No exercicio, mostra a solução é utilizando o JOIN FETCH com a clausula WHERE, fui pesquisar e encontrei um assunto sobre isso, onde o comentário de uma pessoa, começando com a expressão que você pode levar um tiro no pé ao utilizar essa abordagem, por restringir o contexto do JOIN FETCH e diz que 2 JOINS é mais seguro, alguem sabe confirmar que isso pode acontecer ou acontece?

Ele também deixa um exemplo no link abaixo:

https://stackoverflow.com/questions/5816417/how-to-properly-express-jpql-join-fetch-with-where-clause-as-jpa-2-criteriaq

Isso seria uma má abordagem para o problema então?

4 respostas

Oi Douglas,

não sei se eu entendi direito, mas no exercício não é preciso fazer um alias do "join fetch".

A ideia do exercício é usar o join fetch apenas para inicializar o relacionamento lazy (ou seja, planejar o carregamento):

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

Query query = manager.createQuery("select c from Conta c join fetch c.movimentacoes where c.id = :pId");
query.setParameter("pId", 2);

Conta conta = (Conta) query.getSingleResult();

manager.close();

System.out.println(conta.getMovimentacoes().size());

Repare que a clausula "where" apenas filtra pela id da entidade (sem usando um alias do join fetch). ok?

Espero ter ajudado!

abs

Oi Nico, ajudou sim, obrigado!

solução!

Oi Douglas,

Sim, o que a pessoa explica no post faz sentido. Só é uma má abordagem se você não souber o que está acontecendo. Quando você junta o where com fetch, você realmente está restringindo a coleção que vai ser carregada e associada com seu objeto, à apenas os objetos que atendem o critério da seleção.

Uma situação: vamos supor que você quer recuperar todos os alunos que fizeram cursos de java. Caso você faça um fetch join e aplique a restrição ao nome do curso, você vai recuperar todos os alunos, mas quando for olhar a coleção de cursos de cada um dos alunos ela só vai ter os cursos que tem java no nome. É isso que você queria? O que ele explica no post é que você quer recuperar tudo sobre os alunos que fizeram os cursos de java, e nesse caso a coleção deveria ter os cursos de java e os outros que cada um tenha feito.

Esse é o problema do where com fetch join. Tanto que isso nem é previsto na especificação, é uma feature das implementações que oferecem, mas como você pôde ver, deve ser usada com cuidado.

Agora, se para você, recuperar a coleção em um estado inválido não tiver problema, manda bala e usa. Saber o que está acontecendo faz toda diferença. Ótima pergunta! Um outro link interessante que você pode olhar é esse aqui => http://dextra.com.br/cuidado-ao-realizar-consultas-com-join-fetch-e-where-no-hibernate/

Alberto, era isso mesmo, agora ficou bem mais claro, o que você precisa sempre saber é o contexto da sua necessidade, e aplicar ou não a partir dai, entendi, vou dar uma olhada no link, valeu.