Query em tabela many-to-many com atributo

5 respostas
articof
Galera, eu tenho um problema com uma consulta numa relação n-n como segue:
usuario               usuarioMenu               menu
---------             ----------------          ---------
- idUsuario            - chaveComposta          - idMenu
                       - data
tenho as três classes acima @Entity mais uma quarta classe UsuarioMenuPK @Embeddable para mapear a chaveComposta idUsuario e idMenu. Eu peguei o exemplo de uma apostila do Hibernate anotations.

minhas classes:

@Entity
public class Usuario {
	@Id
	@GeneratedValue
	private long id;
@Entity
public class Menu {
	@Id
	@GeneratedValue
	private long id;
@Entity
public class MenuUsuario {

	@EmbeddedId
	private MenuUsuarioPK chaveComposta;
	private Boolean permisao;
@Embeddable
public class MenuUsuarioPK implements Serializable {
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="idUsuario")
	private Usuario usuario;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "idMenu")	
	private Menu menu;
Para gravar sem problemas, funcionou todo ok, mas não consigo fazer uma consulta filtrando apenas por idUsuario independiente do idMenu
public List<MenuUsuario> listaPorUsuario(Usuario u) {
		MenuUsuarioPK mupk = new MenuUsuarioPK();
		mupk.setUsuario(u);
		mupk.setMenu("??"); 
		Criteria crit = getSession().createCriteria(MenuUsuario.class);
			crit.add(Restrictions.eq("chaveComposta", u)); 
		return crit.list();
	}

Na linha 04 se eu não setar um menu, o resultado e zero.

Alguém sabe como resolver esse tipo de consulta com chave composta ??? Obrigado !!

5 Respostas

Lavieri

tente assim

public List<MenuUsuario> listaPorUsuario(Usuario usuario) { return getSession().createCriteria(MenuUsuario.class) .createAlias("chaveComposta","Id") .add(Restrictions.eq("Id.usuario", usuario)) .list(); }

articof

não deu certo Lavieri deu este erro

could not resolve property: usuario of: vo.MenuUsuario

valeu

Lavieri

eu nunca fiz com PK compostas, mas ja fiz N vezes com entidades relacionadas … talvez vc possa acessar a propriedade diretamente…

public List&lt;MenuUsuario&gt; listaPorUsuario(Usuario usuario) { return getSession().createCriteria(MenuUsuario.class) .add(Restrictions.eq("usuario", usuario)) .list(); }

Ps.: eu estou suando os nomes exato que vc colocou aki no seu post, tanto neste minha resposta como na anterior, se algum nome tiver uma letra diferente do seu mapeamento real, pode dar resultados diferentes

articof

exato ! funcionou assim:

public List<MenuUsuario> listaPorUsuario(Usuario u) { return getSession().createCriteria(MenuUsuario.class) .add(Restrictions.eq("chaveComposta.usuario", u)) .list(); }

OBRIGADO !

C

Prezado articof, ou algume que saiba,

a mensagem no guj é antiga, mas como vc fez para dar insert e/ou update na entidade menu, por exemplo?

Eu tenho um caso parecido aqui que não funciona de maneira alguma.

Poderia ajudar por favor?

Mto. obrigado.

Criado 15 de maio de 2009
Ultima resposta 17 de jan. de 2011
Respostas 5
Participantes 3