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!