[Resolvido] Filtrar consulta pela Foreign Key usando Criteria

3 respostas
G

Olá pessoal!
Eu tinha um tópico antigo tratando da mesma dúvida que tenho agora, mas não estou achando.
A dúvida é como criar uma consulta pela FK usando Criteria:
Tenho a seguinte Criteria:

public Integer getTotalFotos(Imovel imovel) {	
		
		Criteria crit = session.createCriteria(Foto.class);
		crit.add(Restrictions.eq("idImovel", imovel.getIdImovel()));
		crit.setProjection(Projections.rowCount());
	    int count = ((Integer) crit.uniqueResult()).intValue();
		return count;
}

A mensagem é:

root cause

org.hibernate.QueryException: could not resolve property: idImovel of: br.com.imobiliaria.bean.Foto

O motivo é que na tabela Foto a id do imóvel é chave estrangeira, se fosse para filtrar por outra coluna seria moleza.
Lendo o manual do Hibernate a partir da página 235 não achei a resposta.
Como filtro pela id do imóvel?
Abraço!

3 Respostas

M

Vc tem q usar o createAlias para referenciar seu objeto da FK e fazer as devidas restrições:

Veja o exemplo abaixo retirado da documentação

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

List cats = sess.createCriteria(Cat.class) .createAlias("kittens", "kt") .createAlias("mate", "mt") .add( Restrictions.eqProperty("kt.name", "mt.name") ) .list();

G

Obrigado Marcos1EM, eu estava fazendo os exemplos do manual do Hibernate, testei alguns menos esse ai, eu consegui fazer com HQL:

public Long getQtdFotos(Long idImovel) {
		Long count = (Long) session.createQuery("select count(id_foto) from Foto where imovel.id = :id")
		.setParameter("id", idImovel)
		.uniqueResult();
		return count;
	}

No caso estou contando pela id da tabela Foto mesmo, o importante é que filtrou pela FK que é “imovel_id_imovel”, mas quero deixar td com Criteria.
Assim que conseguir eu retorno.
Abraço!

G

Consegui!

public Integer getTotalFotos(Imovel imovel) {		
		Criteria crit = session.createCriteria(Foto.class);
		crit.createAlias("imovel", "idImovel")
		.add(Restrictions.eq("imovel.idImovel", imovel.getIdImovel()));
		crit.setProjection(Projections.rowCount());
		crit.setProjection(Projections.count("idFoto"));
		int count = ((Long) crit.uniqueResult()).intValue();
		return count;	
	}

Faz o mesmo que o que eu fiz com HQL.
Obrigado pela dica marcos1EM.
Abraço!

Criado 21 de julho de 2010
Ultima resposta 21 de jul. de 2010
Respostas 3
Participantes 2