[Resolvido]Problema com query hibernate

Erro

IllegalArgumentException in class: model.beans.PessoaVO, getter method of property: id
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of model.beans.PessoaVO.id
javax.faces.el.EvaluationException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of model.beans.PessoaVO.id

método problemático

public ArrayList<EnvolvimentoVO> buscaPorPessoa(long codigo) {
        String hql = "select u from EnvolvimentoVO as u where u.compositeID.pessoa = :codigo";
        Query q = getSession().createQuery(hql);
        q.setParameter("codigo", codigo);
        return (ArrayList<EnvolvimentoVO>) q.list();
}

arquivo de mapeamento

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 27/05/2006 16:45:18 by Hibernate Tools 3.1.0 beta3 -->
<hibernate-mapping>
    <class name="model.beans.EnvolvimentoVO" schema="PUBLIC" table="ENVOLVIMENTOS">
        <composite-id class="model.beans.EnvolvimentoID" name="compositeID">
            <key-many-to-one class="model.beans.FatoVO" column="COD_FATO" name="fato"/>
            <key-many-to-one class="model.beans.PessoaVO" column="COD_PESSOA" name="pessoa"/>
        </composite-id>
        <property name="cond_pessoa" type="java.lang.String"/>
        <property name="categoria" type="integer"/>
    </class>
</hibernate-mapping>

Classes

public class EnvolvimentoVO {
    private EnvolvimentoID compositeID;    
    private String cond_pessoa;
    private int categoria;
    ...
}
public class EnvolvimentoID implements Serializable {
    private PessoaVO pessoa; //cod_pessoa (id) está em PessoaVO
    private FatoVO fato;       
    ...
}

Acho q a query está errada. Como faço para arrumar?

Passar PessoaVO como parametro no método e não id

Você tem que passar um objeto do tipo Pessoa como parâmetro ou utilizar u.pessoa.id na cláusula where.!?

Na realidade id será o atributo de sua classe Pessoa do campo código.

Eu quero passar envolvimentoVO.compositeId.pessoa.id e retorne todos os EnvolvimentoVO que contenham essa pessoa.

No banco, a tabela envolvimentos tem 4 colunas:
cod_fato cod_pessoa cond_pessoa categoria

Eu quero buscar pelos cod_pessoa

Qual é o atributo de pessoa que será utilizado na consulta?

u.pessoa.?

? seria o atributo da classe java que será utilizado como chave da consulta.

o atributo usado na query seria u.pessoa.id

mas repare que pessoa esta em EnvolvimentoID

eu achei q fosse u.pessoa, pois:

<key-many-to-one class="model.beans.PessoaVO" column="COD_PESSOA" name="pessoa"/>

Acho que seria assim?

u.compositeID.pessoa.id

Resolvida a query, agora com outro problema:

IllegalArgumentException in class: model.beans.PessoaVO, getter method of property: id
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of model.beans.PessoaVO.id
javax.faces.el.EvaluationException: org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of model.beans.PessoaVO.id

Como é a classe Pessoa. Posta ela! :wink:

public class PessoaVO implements Serializable{
    private long id;  
    private String nome;
    private int sexo;
    private String nacionalidade;
    private String naturalidade;
   ...

Ele está reclamando de um getter faltando para o campo id de PessoaVO.

Você tem o método

public long getId(){
  return id;
}

na classe pessoa?

tem sim

já ta resolvido

Bom Dia João,

Lembra como resolveu o problema?

Obrigado.