JPQL - Select não funciona com objeto

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 ;   
        }
      

Seu @Id na classe Vizualicao voce define com a anotacao @EmbeddedId.

Na sua classe Embeddable, substitua os objetos pelos seus respectivos id, tipo:

private int usuarioId private int perfilId

E na pesquisa voce pode usar algo como:

Obrigado pela força amigo.

Neste modelo que você está passando eu tenho funcionando , pois veja o tipo de dado é primito ( int ).

No entanto, não sei se é possivel a navegabilidade com o objeto, estou fazendo umas pesquisas e testes , mas até agora só consegui chegar até aqui:

[code]
Query q = manager.createQuery(“SELECT h FROM Visualizacao as h”);

[quote]

Após isso tenho problemas na navegação , justamente por tentar acessar objeto.

acho que o q faltou foi criar um alias par ao id…

Ps.: não sei c vai dar certo… eu sei fazer a constula via criteria do hibernate… se interessar… posso dizer como é

Me manda a consulta do hibernate que eu tento adaptar ao meu problema

[code]
Session session = HibernateUtil.geSession();

Usuario usuario = pegaOUsuarioDeAlgumLugar();

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]

Se voce precisa acessar o Objeto Usuario na sua classe Visualizacao basta incluir o codigo abaixo:

	@ManyToOne
	@JoinColumn( name = "idUsuario", insertable = false, updatable = false )
	private Usuario usuario;

Utilize o formato que eu te passei para seu id.

Ou voce utiliza @EmbeddedId ou @IdClass para definir sua chave composta, senao nao ira funcionar.

A consulta JPQL que te passei tambem funciona pois eu tenho varias consultas dessa forma funcionado.

RESOLVIDO

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&lt;Visualizacao&gt; obterListVisualizacao(Usuario usuario){
		ArrayList&lt;Visualizacao&gt; 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&lt;Visualizacao&gt;) q.getResultList();

Funcionou perfeitamente retorno o list já testei.

		ArrayList&lt;Visualizacao&gt; list = visualizacaoRemote.obterListVisualizacao(usuario);
		
		for (Visualizacao v :list){
                }

Agradeço a todos pela ajuda.

E deixo anotado como ficou o codigo.

Marco Aurélio