Senhores,
Como fica uma consulta complexa com hibernate exemplo:
SELECT valueC
FROM C
INNER JOIN
(
SELECT DISTINCT lookupC
FROM B INNER JOIN
(
SELECT DISTINCT lookupB
FROM A
)
A2 ON B.id = A2.lookupB
)
B2 ON C.id = B2.lookupC
Aprender Hibernate tentando replicar SQL nele é começar errado. Você não precisa ter essas preocupações, deve apenas modelar seu sistema e o Hibernate faz essas coisas chatas como Joins pra você. O seu trabalho é fazer os relacionamentos entre os objetos da forma adequada.
É muito raro o JPQL/HQL dar suporte a uma “consulta complexa”. Em geral, consultas complexas envolvem diversas features de cada banco de dados e isso não é portável.
A solução seria utilizar uma native query, aí sim você poderia executar qualquer query.
Aqui fala mais sobre isso: JPA Consultas e Dicas.
[quote=fabioEM]Senhores,
Como fica uma consulta complexa com hibernate exemplo:
SELECT valueC
FROM C
INNER JOIN
(
SELECT DISTINCT lookupC
FROM B INNER JOIN
(
SELECT DISTINCT lookupB
FROM A
)
A2 ON B.id = A2.lookupB
)
B2 ON C.id = B2.lookupC
[/quote]
Fala fabioEM, as vezes o problema não existe mas fazemos como se existisse, como neste caso você já tem a solução pronta. Então conforme o Hebert Coelho falou use SQL nativo mesmo, através da própria Session do Hibernate, pode usar “Named native query” ou CreateSQLQuery + Transformer.
Outra alternativa: Se na empresa tiver liberdade para criar objetos no banco de dados, crie uma View e mapeie a View diretamente (como se fosse tabela). Na empresa que trabalho por ter equipe de DBAs e de ADs então diminui a liberdade, onde acabamos usando sempre named query nativa (a vantagem da named query nativa em relação a view mapeada é ter mais controle sobre os filtros/parametros).
Acho que é próximo disso
select c
from A a
join a.lookupB b
join b.lookupC c
Tem que verificar se funciona…
Considerando que mapeou (@ManyToOne) A.lookupB para B e B.lookupC para C.
Acho que seu SQL pode ser substituido por:
select valueC from C
join B on B.lookupC = C.id
join A on B.lookupB = B.id
Cara acho que aprender uma ferramenta sem entender suas limitaões não é uma boa. Em projetos grandes com muita regra de banco de dados faz diferena vc saber qual framework vc usar.