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.
Qual erro está apresentando?Como está o método equals da classe grupo?
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>();
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.
pmlm
Janeiro 7, 2013, 10:30am
#6
menininhoBonitinho:
query.setParameter("cto", "cto");
query.setParameter("admin", "admin");
query.setParameter("ceo", "ceo");
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:
Agora, sim ! Testei e passou 100%. Obrigado