Complicações com fetch JPA

Boa tarde,

Desde de ontem estou tentando aplicar um filtro simples em um query JPA, porém sem sucesso. Vamos aos fatos:

Pretendo fazer uma query assim:

SELECT * FROM TABELA_A a
(INNER or LEFT) JOIN TABELA_B b
ON b.ID_a = a.ID
WHERE a.ID = qualquerValor
AND b.data_exclusao is null;

Onde a cardinalidade entre estas entidades, ou tabelas, é OneToMany - ou seja, A - *B !

Quando eu faço um criteria buscando a entidade A, a lista de registros da coleção B esta em modo lazy, até nenhum problema. Porém eu não quero todos os registros da tabela B, eu desejo que aquele filtro IS NULL seja aplicado.

Pensando neste objetivo, montei uma query assim: (lembrando que o objeto B existe como campo na tabela A e a forma escrita esta correta)

Root<A> root = query.from(A.class);
root.fetch( "b", JoinType.INNER );

predicates.add( root.get("b").get("dataExclusao").isNull() );

testando desta forma, fui analisar a query de saida e vi que o JPA esta fazendo dois relacionamentos: Um para o fetch e outro para a condição do predicado.
Até ai tudo bem, não sei dizer se o JPA esta correto, ou se eu montei fa forma errada.

Dai parti para outra abordagem, ou fazer com Join<>.

Fiz este código:

Join<A,B> joinB = root.join("b", JoinType.INNER);

predicates.add( joinB.get("dataExclusao").isNull() );

Analisei a query de saida, tudo normal, relacionamento feito, porém a lista esta em LAZY, quando do um GET nela o JPA vai até o banco pega todas as informações na tabela B que tem chave de A, me trazendo registros errados, pois não aplica o filtro dataExclusao is NULL.

Tentei fazer por JPQL, mas não é possivel pois quando faço INNER JOIN ele vem em LAZY e acontece o problema acima, quando eu faço JOIN FETCH eu não consigo relacionar clausulas no WHERE da query.

Eu tenho pouca experiência com JPA, até o momento cheguei a conclusão de que não consigo fazer esta simples query pelos meios que conheço.

Alguém sabe me ajudar ou me dizer se isto possa vir a ser uma falha da API.

Muito obrigado, boa noite!

Tenta assim:select c from Cachorro c left join fetch pulgas p where c.id = :id and b.dataNasicmento is null

Obrigado a resposta, mas eu já tentei assim.

Pelo o que entendi, você me disse para colocar um alias na tabela relacionada e tentar criar uma clausula no WHERE, correto?!

Então, quando se faz JOIN FETCH, não é possivel colocar alias na tabela, impossibilitando colocar clausulas desta tabela no WHERE.

Eu estou ainda tentando achar um modo, mas sem sucesso!
Valeu a força!

supondo que você tenha uma entidade Cachorro e nele um Collection de Pulga chamado pulgas, obviamente tudo isso mapeado no seu arquivo de configuração funciona… eu faço jpaqls assim, a unica diferença é que eu coloco o alias no campo do fetch, nesse caso por exemplo trocaria “Cachorro c left join fetch pulgas p” por " Cachorro c left join fetch c.pulgas p"… editando…sugiro tentar assim, com o alias em “c.pulgas”

supondo que você tenha uma entidade Cachorro e nele um Collection de Pulga chamado pulgas, obviamente tudo isso mapeado no seu arquivo de configuração funciona… eu faço jpaqls assim, a unica diferença é que eu coloco o alias no campo do fetch, nesse caso por exemplo trocaria “Cachorro c left join fetch pulgas p” por " Cachorro c left join fetch c.pulgas p"…[/quote]

Obrigado pela resposta.

Então, eu tentei colocar o alias na tabela relacionada, ou seja, c.pulgas p, porém me retorna um erro dizendo que houveram erros no parse do SQL, olhei em alguns livros e forum e vi que todos fazem sem alias, logo entendi que não era possivel colocar.

Mas você disse que funciona, ou vou tentar de novo, ver se errei em algum outro ponto.

Valeu!

Então, como tinha falado, tomei o erro novamente, segue:

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [SELECT c FROM Cachorro c LEFT  JOIN FETCH c.pulgas p WHERE c.id = :codigoProtocolo AND p.dataExclusao IS NULL AND p.nomeLoginExclusao IS NULL ], line 1, column 53: syntax error at [p].
Internal Exception: MismatchedTokenException(80!=-1)

Logo deduzi que não é possivel fazer FETCH e colocar alias, como também não é possivel pelo objeto Fetch<A, B>. Logo cheguei a conclusão de que não tem uma forma, afinal tentei por objetos e por JPQL …

Obrigado a força.