Dúvida: Critéria e ManytoMany

Bom dia!!!

Eu tenho uma classe Manutenção:

[code]
public class Manutencao implements Serializable{

private Set servidor;

@ManyToMany(fetch=FetchType.LAZY)
@JoinTable(name=“manutencao_servidor”,
joinColumns={@JoinColumn(name=“fk_manutencao”)},
inverseJoinColumns={@JoinColumn(name=“fk_servidor”)})
public Set getServidor() {
return servidor;
}
public void setServidor(Set servidor) {
this.servidor = servidor;
} [/code]

Fazendo isso ele cria uma tabela “manutencao_servidor”. Até aí funciona blz!

O problema é na critéria, como eu faço para listar todas as manutenções de um servidor?

@SuppressWarnings("unchecked") public List<Manutencao> pesquisaManu(){ Criteria cri = session.createCriteria(Manutencao.class); cri.add(Restrictions.eq("servidor", 1L)); return cri.list(); }
Esta critéria acima funcionaria para mapeamento @ManyToOne.

Teria fazer isso na critéria, ao invés de um sql ou hql?

Desde de já agradeço a atenção e ajuda de todos.

Um Abraço,

Tubarão

Porque não declara o ManyToMany no servidor também?

Boa tarde!!!

Lipe, vc está falando para mapear a classe servidor também, para questão de navegação?

Pode ser assim?

Classe Servidor {

private List<Manutencao> manutencoes;

@ManyToMany
	public List<Manutencao> getManutencoes() {
		return manutencoes;
	}
	public void setManutencoes(List<Manutencao> manutencoes) {
		this.manutencoes = manutencoes;
	}
}

Andei pesquisando um pouco e encontrei algo parecido com esta critéria aqui. Testei e funciona! Não se se está certo!

[code]
@SuppressWarnings(“unchecked”)
public List pesquisaManu(Servidor server){
Criteria cri = session.createCriteria(Manutencao.class);
//server.setId(3L);
cri = cri.createCriteria(“servidor”);
cri.add(Restrictions.eq(“id”, server.getId()));
System.out.println(“Valor da lista:::::::” + cri.list().size());

	return cri.list(); 
}[/code]

Desde de já, agradeço a sua atenção e ajuda!!!

Tubarão

Ao mapear da forma adequada, para pegar a coleção de Manutenções de um Servidor, bastaria

Servidor servidor = ( Servidor ) session.get( Servidor.class, 1L );
List< Manutencao > manutencoes = servidor.getManutencoes();

certo? ;D

Bom dia!

Lipe, valeu d+ deu certo, e ficou muito elegante a pesquisa…

Só alterei o manytomany da classe Servidor para a collection de manutenções, para ele não criar um novo mapeamento na hora de gerar o banco pelo hibernate.

@ManyToMany(fetch=FetchType.LAZY, mappedBy="servidor")
	public Set<Manutencao> getManutencoes() {
		return manutencoes;
	}
	public void setManutencoes(Set<Manutencao> manutencoes) {
		this.manutencoes = manutencoes;
	}

Classe manutenção:

@ManyToMany(fetch=FetchType.LAZY)
	@JoinTable(name="ctbc_datac_manutencao_servidor",
				joinColumns={@JoinColumn(name="fk_manutencao")},
				inverseJoinColumns={@JoinColumn(name="fk_servidor")})
	public Set<Servidor> getServidor() {
		return servidor;
	}
	public void setServidor(Set<Servidor> servidor) {
		this.servidor = servidor;
	}	

Muito obrigado, valeu…