Criteria - Relacionamento

Boa tarde!

Em minha classe PNR existe o um relacionamento para pnrBlocoConjunto - idem pnrQuadra - idem pnrArea.

então pnr.pnrBlocoConjunto.pnrQuadra.pnrArea.idArea retornaria, em outras situações, o id da area daquele pnr.

Porém tentando contar a quantidade de pnr que tem o idArea igual a ? é retornado o seguinte erro.

org.hibernate.QueryException: could not resolve property: pnrBlocoConjunto.pnrQuadra.pnrArea.idArea of: br.mil.siscop.model.PNR

Estou utilizando Criteria.

segue código:

	public Integer qtdPNRByArea(PNRArea pnrArea) {	
		Session sessao = HibernateUtil.getSession();
		Criteria criteria = sessao.createCriteria(PNR.class) 
							.add( Restrictions.eq("pnrBlocoConjunto.pnrQuadra.pnrArea", pnrArea) );
							criteria.setProjection(Projections.rowCount());
		return ((Integer)criteria.list().get(0)).intValue(); 
	}

Valew!

edysnipes,

Tenta assim:

public Integer qtdPNRByArea(PNRArea pnrArea) {    
    Session sessao = HibernateUtil.getSession();  
    Criteria criteria = sessao.createCriteria(PNR.class)   
                        .add( Restrictions.eq("pnrBlocoConjunto.pnrQuadra.pnrArea.idArea", pnrArea.idArea) );  
                        criteria.setProjection(Projections.rowCount());  
    return ((Integer)criteria.list().get(0)).intValue();   
}  

Mas a mensagem de erro informa que em pnrArea não teria esse caminho pnrBlocoConjunto.pnrQuadra.pnrArea.idArea

Você tem os gets e sets nos models corretamente?

Tenho sim! Até porque consegui resolver meu problema assim:

	public Integer qtdPNRByArea2(PNRArea pnrArea) {
		Session sessao = HibernateUtil.getSession();
		String sql = "select count(*) from PNR where pnrBlocoConjunto.pnrQuadra.pnrArea.idArea = ?";
		Integer qtd = 0;
		try {
			Query query = sessao.createQuery(sql);
			query.setInteger(0, pnrArea.getIdArea());
			return ((Long)query.list().get(0)).intValue();
		} catch (Exception e) {
			e.printStackTrace();
			return 0;
		}
	}

Depois irei tentar descobrir qual o problema lá.

Obrigado!

Você precisa usar o createAlias, para usar as propriedades “dentro” de outras propriedades.

criteria.createAlias("pnrBlocoConjunto.pnrQuadra", "quadra");
criteria.createAlias("quadra.pnrArea", "area");

aí então vc pode usar

"Restrictions.eq("area.idArea", pnrArea.idArea)"

[]´s

Isso mesmo! Valew!