Query em tabela many-to-many com atributo

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;

[code]@Entity
public class MenuUsuario {

@EmbeddedId
private MenuUsuarioPK chaveComposta;
private Boolean permisao;[/code]

[code]@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;[/code]

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 !!

tente assim

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

não deu certo Lavieri deu este erro

could not resolve property: usuario of: vo.MenuUsuario

valeu

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

exato ! funcionou assim:

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

OBRIGADO !

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.