Query com list de paramêtro - hibernate (Resolvido)

6 respostas
M

Galera quebrando a cabeça e não saio do lugar…

Tenho uma classe usuário e outra chamada grupo. Um usuário tem uma lista de grupos.

Eu preciso de uma query que receba uma lista de grupos e retorne apenas o usuário que tem exatamente aquela lista de grupos, inclusive na quantidade.

por exemplo, joe tem os grupos cto, ceo admin. suzy tem cto e ceo. Se eu passsar um lista com os grupos cto, ceo admin, tem que vir apenas o joe.

Cheguei até a mapear a classe composta pra ver se conseguia, mas falhou tudo miseravelmente.

A última coisa que tentei foi isso:

Query query = getSession().createQuery("from Usuario u where u.grupos in (:grupos)");
		Usuario usuario =    (Usuario) query.setParameterList("grupos", listaGrupos).uniqueResult();
		 return usuario;

Ajuda aí, galera. Não aguenta mais ver o junit ficar vermelho com esse test. :cry:

6 Respostas

A

Qual erro está apresentando?Como está o método equals da classe grupo?

M

De tudo que tentei, os erros foram lista vazia, erro de sintaxe, objeto que nao poderia ser convertido de um tipo pro outro.

O mapeamento é unidirecional. Grupo não mapeia usuario.

Em todo caso, o equals do grupo tá assim :

@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Grupo other = (Grupo) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (nome == null) {
			if (other.nome != null)
				return false;
		} else if (!nome.equals(other.nome))
			return false;
		return true;
	}

O mapeamento dos grupos na classe usuário ta assim:

@OneToMany(cascade = CascadeType.ALL)
	@JoinTable(name = "USUARIO_GRUPO", joinColumns = { @JoinColumn(name = "USUARIO_ID") }, 
	inverseJoinColumns = { @JoinColumn(name = "GRUPO_ID") })
	private List<Grupo> grupos = new ArrayList<Grupo>();
P

Assim para o ar…

M

Amigo, desse jeito também não passou no teste.

Fiz assim apenas para testar:

public Usuario getUsuarioPorGrupo() {

		Query query = getSession()
				.createQuery(
						"from Usuario u where :cto member of u.grupos and "
								+ ":ceo member of u.grupos and :admin member of u.grupos");

		query.setParameter("cto", "cto");
		query.setParameter("admin", "admin");
		query.setParameter("ceo", "ceo");

		Usuario usuario = (Usuario) query.uniqueResult();
		return usuario;

	}

No banco tenho apenas um usuario e esses três grupos:cto,ceo e admin.

O usuário possui esses 3 grupos, então a query não poderia retornar nula.

P

A lista de grupos é composta por elementos Grupo não de String. Os parâmetros devem ser um Grupo com id e nome devidamente preenchido.

Para passar apenas A string com o nome, deverá ser mais ou menos assim:

M

Agora, sim ! Testei e passou 100%. Obrigado

Criado 6 de janeiro de 2013
Ultima resposta 7 de jan. de 2013
Respostas 6
Participantes 3