Consultas complexas com Hibernate

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.