Problemas com Fetch Join do JPA

6 respostas
P

Pessoal,
Não se é possivel, mas estou tentando fazer um fetch join entre 3 tabelas. No entanto, esta ocorrendo erros durante a execução do código.
Segue 2 exemplos abaixo:

select t1 from Tabela1 t1 inner join fetch t1.tabela2 inner join fetch t1.tabela2.tabela3

select t1 from Tabela1 t1 inner join fetch t1.tabela2 t2 inner join fetch t2.tabela3

Nenhuma desta querys executam. As tabelas citadas possuem um relacionamento 1-N.
Realmente não sei se isso é possivel. Sei q o fetch join funciona perfeitamente com 2 tablemas.
Será que alguém poderia me ajudar com essa questão ?
Abs

6 Respostas

B

Kra, tive problemas com isso a pouco tempo e resolvi de outra forma, não coloquei o fetch na query e após resgatar os objetos, dei um Hibernate.initialize(meuobjeto.propriedadeParaSerInicializada());, daí resolveu.

[]'s

F

Se não me engano isso não funciona

fetch t1.tabela2.tabela3

Tem que ir fazendo uma por uma até chegar na 3.
Algo assim (tem q acertar os alias acho):
t1.tabela2
tabela2.tabela3

P

Não conhecia o Hibernate.initialize, mas pelo que entendi, ele é executado com o objeto recuperado. Não cheguei a usa-lo para afirmar qualquer coisa, mas me parece que não muda muito pois haverá uma nova execução de query.
Pra falar a verdade, nem tenho como utilizar ele pois estou utilizando o EclipseLink. Não sei ao certo se ele possui algo similar ao initialize Hibernate.
A questão é que eu queria reduzir o número de query executadas. Tenho como alterativa alterar para FetchType.EAGER através de reflection em tempo de execução. Mesmo assim terei várias execuções de querys.

P

Será que ninguém teria uma idéia de como resolver isso ?

R

Se eu entendi bem…

No seu relacionamento…

Tem a Tabela 1

A tabela 1 tem vários… tabela 2

E a tabela 2 tem várias tabela 3?

Isso?

Se for, o hibernate não vai retornar um resultado legal… pois vai criar um tabela 1… para cada tabela 3 encontrado… ou seja… vai duplicar os tabela 1

Se for… tabela 1… tem um tabela 2… e tabela 2 tem um tabela 3… aí o resultado sai lega…

Essa query deve funcionar (idependente do mapeamento se é many to one ou one to many):

from Tabela1 t1 inner join fetch t1.tabela2 t2 inner join fetch t2.tabela3 t3

fabiofalci: Você havia perguntado no outro post sobre coisas paupáveis… Uma das vantagens do Next, é resolver o problema dos registros duplicados do hibernate… que citei acima :wink:

R

Se os mapeamentos forem… One to many…

É recomendável fazer 3 queries separadas…

Faz uma query para a t1… depois uma para a t2… e seta os t1 com os t2 encontrados…
Depois uma para a t3… e seta os t2 com os t3 encontrados…

Criado 25 de fevereiro de 2010
Ultima resposta 3 de mar. de 2010
Respostas 6
Participantes 4