Hibernate Criteria para tabelas "irmãs"

6 respostas
F

Pessoal,

Estou com um problema em fazer um hibernate criteria de duas tabelas “irmãs”.
Ou seja, de duas tabelas que tenham o mesmo pai.
Exemplo:

Tabela Principal: Carro
Tabela Filha 1: Revisoes do Carro
Tabela Filha 2: Proprietários do Carro

Explicando, a tabela revisoes tem um campo que é a chave da tabela principal.
E a tabela de proprietarios tb tem um campo que é chave da tabela principal.
Gostaria de fazer o join destas tabelas por estes campos.

Alguma idéia?

6 Respostas

F

Seria algo como fazer esse sql:

faelcavalcanti

quais informacoes ao certo voce deseja exibir? digo isto porque dependendo da demanda de dados seria interessante voce utilizar um DTO.

F

Na verdade o que eu queria seria os dados da tabela pai.

Seria um select assim:

na verdade, acho que nao precisa do primeiro clausula do where:

faelcavalcanti

vamos lá fábio, foi mal a demora por corresponder.

mas quanto a sua query, acho que percebi que você necessita de todos os carros que tenham tidos pelo menos uma revisao e passado por um proprietario? caso a resposta seja sim, basicamente a query seria a mesma que vc a utiliza, da seguinte forma:

select c from Carro c inner join Proprietario p on p.carro = c inner join Revisao r on r.carro = c where -- seus filtros em especifico caso necessario caso voce queira enfatizar o caso de nao ter tido revisoes, utilize left join para isto.
seguem abaixo algumas fontes que poderão te ajudar e complementar estudo no uso de critérias abaixo:

referências a partir do site do hibernate : http://www.hibernate.org/hib_docs/reference/en/html
api do hibernate : http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html
post de um colega sobre o assunto : http://blog.mauros.org/?p=5
discussão sobre o assunto no guj : http://www.guj.com.br/posts/list/48069.java
visão rápida pelo site do javapassion : http://www.javapassion.com/j2ee/hibernatecriteria.pdf

espero que tenha ajudado!

F

faelcavalcanti:
vamos lá fábio, foi mal a demora por corresponder.

mas quanto a sua query, acho que percebi que você necessita de todos os carros que tenham tidos pelo menos uma revisao e passado por um proprietario? caso a resposta seja sim, basicamente a query seria a mesma que vc a utiliza, da seguinte forma:

select c from Carro c inner join Proprietario p on p.carro = c inner join Revisao r on r.carro = c where -- seus filtros em especifico caso necessario caso voce queira enfatizar o caso de nao ter tido revisoes, utilize left join para isto.

Velho, é exatamente esta query que quero fazer, porém queria fazer ela utilizando Criteria.

Já tentei duas abordagens:

  1. começar o criteria a partir da classe Carro e depois tentar adicionar os dois joins. Não consegui adicionar os joins.
  2. começar o criteria a partir da classe Revisao ou Proprietario e depois tentar adicionar os outros joins. Também não consegui.

Já li e re-li a documentacao do hibernate.
Li também as referencias que vc me passou.
Mas em nenhum dos casos, há uma explicacao de como fazer estes joins.

faelcavalcanti

verifique neste link, na seção 15.7 um exemplo de uso ou em associações.
existe também este site que poderá te ajudar com alguns exemplos no uso do hibernate, assim como critéria no item 22.

você pode utilizar por exemplo

criteria.createCriteria("proprietario.revisoes", "revisao", Criteria.LEFT_JOIN);ou via restriction mesmo se beneficiando pelo relacionamento. veja este post no guj com dúvida parecida, pode clarear para você.
uma sugestão seria implementar um criteria generico para reuso.

Criado 4 de setembro de 2008
Ultima resposta 10 de set. de 2008
Respostas 6
Participantes 2