Consultando três tabelas com Hibernate

4 respostas
R

Bom dia pessoal, estou desenvolvendo uma aplicação que possui um cadastro de ativos (equipamentos físicos, imobiliário, etc), usuários e custodiantes desses ativos, que pode ser apenas um ou mais.

O relacionamento é N para N com um campo para data na classe custodiante, para guardar a data da associação do custodiante ao ativo.

Efetuei o mapeamento das classes utilizando o Annotations, como mostro abaixo:

Classe Usuario

@OneToMany(fetch = FetchType.EAGER)

@JoinColumn(name="idUsuario")

private Collection<Custodiante> custodiantes;

Classe Ativo

@OneToMany(fetch = FetchType.EAGER)

@JoinColumn(name="idAtivo")

private Collection<Custodiante> custodiantes;

Classe CustodiantePK

@ManyToOne(fetch = FetchType.EAGER)

@JoinColumn(name="idUsuario")

private Usuario usuario;

      

@ManyToOne(fetch = FetchType.EAGER)

@JoinColumn(name="idAtivo")

private Ativo ativo;

Classe Custodiante

@EmbeddedId

private CustodiantePK chaveComposta;

 

@Column(name="data")

@Temporal(TemporalType.DATE)

private Date data;

O Hibernate criou as tabelas e os relacionamentos de forma correta no meu banco de dados, porem estou com dificuldade em executar uma query relacionando as três classes.

O meu objetivo é recuperar apenas os custodiantes de um ativo selecionado

Na console do MYSQL a query funciona se eu passar o parâmetro do idativo

select u.idusuario, u.nome from usuario u

where not exists (select u.idusuario from custodiante c, ativo a

        where u.idusuario = c.idusuario

                and a.idativo = c.idativo

                and a.idativo = :idativo)

Usando a API Criteria, estou tentando fazer da seguinte forma:

public List<Usuario> buscarPorCustodiante() {

            

Criteria criteria = session.createCriteria(Usuario.class,"usuario");              
        
DetachedCriteria subconsulta = DetachedCriteria.forClass(Custodiante.class, "c").setProjection(Property.forName("c.chaveComposta.usuario.idUsuario"));         

Criteria.add(Property.forName("idUsuario").notIn(subconsulta));          

return criteria.list();

}

Porém, como vocês podem perceber consegui fazer só uma parte da consulta, não sei como relacionar as demais classes neste método.

Espero que alguém possa me ajudar, se precisarem de mais detalhes, estou a disposição.

Forte abraço a todos!

4 Respostas

drsmachado

Camarada, corrija o tópico, não dá pra entender nada.
Use a tag [code]

R

Desculpe drsmachado, editei o post veja se melhorou.

Abraço!

fabiomedeirosf

Olá Ronaldo!

Seguinte, num relacionamento N:N, qdo vc possui apenas a tabela intermediária entre duas outras (tabela rel): (a) se esta possui apenas os ids das entidades X e Y, sendo eles Pk e Fk, no seu mapeamento vc terá apenas as collections, exemplo:

public class X {

private List<Y> listaY;
}
e,
public class Y {

private List<X> listaX;
}
Ambas as entidades com as devida anotações que omiti aqui para simples exemplificação.

(b) se sua entidade de "rel" possuir os ids de X e Y, mas TAMBÉM possuir um identificador unico (por exemplo: id_x_y_rel) ai sim no relacionamento do JPA vc terá o objeto embeddable.

Basta vc analisar certinho sua modelagem.

[]s

PS: no meu blog, listado na assinatura do post, tenho algumas postagens acerca de JPA, mas ainda não abordei a situação N:N, apenas 1:N, dê um look lá! ;)

R

fabiomedeirosf,

Realmente, no meu caso, se encaixa a opção a que você descreveu, a única diferença é que eu tenho ainda um campo a mais nessa tabela, que não é chave, somente a titulo de informação, que é um campo DATA.

O hibernate criou as tabelas e os relacionamento o problema é como fazer a consulta.

Obrigado pela ajuda!

Criado 10 de abril de 2012
Ultima resposta 10 de abr. de 2012
Respostas 4
Participantes 3