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!