Pessoal, estou realizando uma consulta JPQL buscando uma entidade que possui chave composta.
E além disso a chave é formada por 2 objetos.
Tentei de várias formas e não estou obtendo sucesso, acredito que é por causa da chave ser feita com objetos.
Alguém já passou por isso ?
Segue os códigos:
Entitidade Visualizacao
@Entity
@Table(name="sis10_visualizacao")
public class Visualizacao implements Serializable{
private static final long serialVersionUID = 1L;
@Id
private VisualizacaoID id ;
@OneToOne
private Hierarquia hierarquia;
//getters e setters omitidos
}
Chave composta da entidade Visualizacao “acima”
@Embeddable
public class VisualizacaoID implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
private Usuario usuario;
@ManyToOne
private Perfil perfil;
//getters e setters omitidos
}
Entidade Usuario
[code]@Entity @Table(name=“sis09_usuario”)
public class Usuario implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="usua_id")
private int id;
//omitido o restante da classe
}
[/code]
Segue minha instrução para recuperar somente os usuarios:
public ArrayList<Visualizacao> obterListVisualizacao(Usuario usuario){
ArrayList<Visualizacao> listVisualizacao = null;
if ( usuario.getId() == 0 ){
throw new IllegalArgumentException("O usuário informado está inválido.");
}
Query q = manager.createQuery("SELECT h FROM visualizacao as h WHERE h.id.usuario.id =:usuario");
q.setParameter("usuario", usuario.getId());
listVisualizacao = (ArrayList<Visualizacao>) q.getResultList();
return listVisualizacao ;
}
List<Visualizacao> visualizacoes = session
.createCriteria(Visualizacao.class)
.createAlias(“id”,“Id”) //… aqui eu crio um apelido para o objeto VisualizacoesID , estou chamando ele de “Id”
.createAlias(“Id.usuario”,“Usuario”) //… aqui eu crio um apelido para o objeto Usuario de VisualizacaoID estou chamando ele de “Usuario”
.add(Restrictions.eq(“Id.usuario”,usuario))
.addOrder(Order.asc(“Usuario.nome”))
.list();[/code]
Obrigado pela ajuda pessoal , este forum tem um nivel muito bom.
Consegui solucionar com a ajuda de vocês.
Fiz assim:
Na classe que possui a chave composta inclui a anotação que foi recomendada:
@Embeddable
public class VisualizacaoID implements Serializable {
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn( name = "idUsuario", insertable = false, updatable = false )
private Usuario usuario;
@ManyToOne
private Perfil perfil;
Após isso realizei o select com JPQL conforme eu já estava fazendo:
public ArrayList<Visualizacao> obterListVisualizacao(Usuario usuario){
ArrayList<Visualizacao> listVisualizacao = null;
if ( usuario.getId() == 0 ){
throw new IllegalArgumentException("O usuário informado está inválido.");
}
Query q = manager.createQuery("SELECT h FROM Visualizacao as h WHERE h.id.usuario = :usuario ");
q.setParameter("usuario", usuario);
listVisualizacao = (ArrayList<Visualizacao>) q.getResultList();
Funcionou perfeitamente retorno o list já testei.
ArrayList<Visualizacao> list = visualizacaoRemote.obterListVisualizacao(usuario);
for (Visualizacao v :list){
}