Consultas complexas com Hibernate

5 respostas
F

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

5 Respostas

von.juliano

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.

Hebert_Coelho

É 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.

javaflex
<blockquote><div class="quote-author">fabioEM:</div>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 <a href="http://B.id">B.id</a> = A2.lookupB

)

B2 ON <a href="http://C.id">C.id</a> = B2.lookupC

</blockquote>

Fala fabioEM, as vezes o problema não existe mas fazemos como se existisse, como neste caso você  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).

rogelgarcia

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

F

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.

Criado 28 de janeiro de 2013
Ultima resposta 30 de jan. de 2013
Respostas 5
Participantes 5