[Resolvido] Duvida - Hql com mapeamento ManyToMany

3 respostas
N

Ola.

Meu problema é o seguinte: tenho uma classe q possui referencia para ela mesma:

@Entity
public class Usuario {
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY) 
	@Column
	private int id;
	@Column(length=80)
	private String nome;
	@Column(length=20)
	private String login;
	@Column(length=20)
	private String senha;
	@ManyToMany(fetch=FetchType.EAGER,targetEntity=Usuario.class,cascade={CascadeType.ALL})
	private List<Usuario> contatos;
}

e preciso selecionar os usuarios q tem um usuario especifico como contato.
Explicando melhor: O hibernate mapeou e fez o banco certinho da maneira como ta acima, ele criou uma tabela USUARIO e uma USUARIO_USUARIO q possui o ID do usuario1 e o ID do usuario2, simulando os contatos. Se o usuario1 tem o usuario2 adicionado, entao na tabela vai ter o registro USUARIO_USUARIO(1, 2), nesse caso o usuario2 nao tem o usuario1 como contato, apenas o usuario1 possui o usuario2. Preciso uma hql q traga pra mim todos os Usuarios q possuem, por exemplo, o usuario2 adicionado, ali no exemplo o select me traria apenas o usuario1.

Ja tentei d varias formas: “from Usuario where :usuario = contatos”, “from Usuario where :usuario in contatos”, “from Usuario where :usuario.id = contatos.id”; mas nao consigo fazer funcionar.

Se eu fizer o select: “select contatos from Usuario” ele traz certinho os contatos desse usuario, mas nao consigo trazer os contatos q TEM esse usuario.

Se nao fui bem claro, peçam maiores explicaçoes.

Desde ja agradeco.

3 Respostas

Lavieri

bom, ja que vc ker, fazer com Hibernate, talvez uma solução com criteria te sirva, então la vai...

public List&lt;Usuario&gt; findUsersByContato(Usuario contato) {
    DetachedCriteria dc = DetachedCriteria.forClass(Usuario.class)
                .createCriteria("contatos") //sub-criteria para os contatos
                .add(Restrictions.eq("id", contato.getId()); //onde o id do contato = contato.getId()

    return dc
                .getExecutableCriteria(getSession()) //injetando a sessão do hiberante
                .list(); //fazendo a lista
}

realizando a busca, dos Usuarios, onde em seus contatos, existe um onde o ID bate com o ID enviado

N

Cara, valeu

era EXATAMENTE ISSO que eu queria! : :smiley:

mto obrigado.

Lavieri

NeRdE:
Cara, valeu

era EXATAMENTE ISSO que eu queria! : :smiley:

mto obrigado.

c precisar de restrições antes de restringir os contatos… por exemplo todos os usuarios maiores de 18, onde tenham o contato X … terá q por as restrições do Usuario (e não do contato) … antes do createCriteria(“contatos”)

Criado 20 de maio de 2009
Ultima resposta 21 de mai. de 2009
Respostas 3
Participantes 2