Tenho as seguintes classes
[list]classe Acao, representa a ação que o usuário vai realizar no sistema(Salvar, cadastrar, deletar).[/list]
[list]classe Perfil, representa o perfil do Usuario.[/list]
[list]classe PermissaoPerfilAcao, que representa a permissao que o perfil tem para realizar determinado ação.[/list]
classe PermissaoPerfilAcao tem uma Chave composta formada pelas Classes Acao e Perfil. Utilizo Hibernate 3.
Código e mapeamento classe Acao
@Entity
@Table(name="acao")
public class Acao implements Serializable{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "acao_id")
private Integer id;
@Column(name = "acao_nome", nullable=false, length=60)
private String nome;
@ManyToOne( fetch = FetchType.EAGER)
@JoinColumn( name="pgweb_id",insertable=true,updatable=true)
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE
private Pgweb pagina;
...
Código e mapeamento classe Perfil
@Entity
@Table(name="perfil")
public class Perfil implements Serializable{
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name = "perfil_id")
private Integer id;
@Column(name = "perfil_nome",unique=true, nullable=false, length=40)
private String nome;
Código e mapeamento classe PermissaoPerfilAcao
@Entity
@Table(name="permissao_perfil_acao")
public class PermissaoPerfilAcao implements Serializable{
@EmbeddedId
private PerfilAcaoPK chaveComposta;
@Column(name="nivel_permissao", nullable=false)
private int nivel;
...
Código e mapeamento chave composta PerfilAcaoPk
@Embeddable
public class PerfilAcaoPK implements Serializable{
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="perfil_id")
@Fetch(FetchMode.JOIN)/
@Cascade(org.hibernate.annotations.CascadeType.ALL
private Perfil perfil;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="acao_id",insertable=true,updatable=true)
@Fetch(FetchMode.JOIN)
//@OrderBy("pagina, nome")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Acao acao;
...
Quando tento pegar uma lista de permissões de um perfil(Olhar o metodo abaixo), sem ORDER BY, funciona perfeitamente, consigo pegar os dados do Objeto Acao(nome, pagina) e Perfil(nome) dentro do Objeto PermissaoPerfilAcao, e ele faz um único select(olhar abaixo QUERY sem ORDER BY). Mas quando tento fazer um ORDER BY Acao.nome , Acao.pagina, dá erro, por que no Query não tem um INNER JOIN para a tabela perfil e acão. Como faço para o Hibernate colocar o INNER JOIN no QUERY? ou se alguem tiver uma outra sugestão para mapear estes relacionamento.
QUERY sem ORDER BY (este funciona)
[color=red]Hibernate: select this_.acao_id as acao2_5_0_, this_.perfil_id as perfil3_5_0_, this_.nivel_permissao as nivel1_5_0_ from permissao_perfil_acao this_ where this_.perfil_id=? order by this_.acao_id asc, this_.perfil_id asc[/color]
QUERY com o ORDER BY só do nome(dá erro)
[color=red]Hibernate: select this_.acao_id as acao2_5_0_, this_.perfil_id as perfil3_5_0_, this_.nivel_permissao as nivel1_5_0_ from permissao_perfil_acao this_ where this_.perfil_id=? order by this_.acao_id asc, this_.perfil_id asc, a2_.acao_nome asc[/color]
Erro
[color=red]SEVERE: Unknown column ‘a2_.acao_nome’ in ‘order clause’[/color]
Metodo para pegar a lista de permissões de um perfil
public List<PermissaoPerfilAcao> getListPermissaoPerfil(Perfil p){
try{
Criteria c = session.createCriteria(PermissaoPerfilAcao.class);
c.add(Expression.eq("chaveComposta.perfil",p));
c.addOrder(Order.asc("chaveComposta"));
//c.createAlias("chaveComposta", "ch").createAlias("ch.acao", "a").addOrder(Order.asc("a.nome"));
//c.addOrder(Order.asc("chaveComposta.acao.nome"));
return c.list();
}catch(Exception e){
System.out.println(e);
return null;
}
}