Hibernate: Criteria, SubCriteria

6 respostas
facholi

pessoal, aqui eu faço uma subcriteria:

Criteria criteria = session.createCriteria(this.clazz);
criteria.createCriteria(sfield).add(Restrictions.ilike(sfield, val + "%"));

por exemplo, agenda.cliente.nome ilike ‘R%’

depois disso, como faço para voltar em ‘agenda’ e fazer uma consulta qualquer em algum atributo, tipo: agenda.data = ‘algumacoisa’??

6 Respostas

_fs

Assim:

Criteria criteria = session.createCriteria( Agenda.class );
Criteria subCriteria = criteria.createCriteria( "cliente" );
subCriteria.add( Restrictions.like( "nomeCliente", nome );
criteria.add( Restrictions.like( "dataAgenda", new Date() );

criteria.list();

Ou direto:

Criteria criteria = session.createCriteria( Agenda.class );
criteria.createCriteria( "cliente" ).add( Restrictions.like( "nomeCliente", nome );
criteria.add( Restrictions.like( "dataAgenda", new Date() );

criteria.list();

Ou você utiliza createAlias:

Criteria criteria = session.createCriteria( Agenda.class )
                        .createAlias( "cliente", "cliente" )
                        .add( Restrictions.like( "cliente.nomeCliente", nome );
                        .add( Restrictions.like( "dataAgenda", new Date() );
criteria.list();
facholi

olha só o que quero fazer:

List<Boletim> boletins = factory.getSession().createCriteria(Boletim.class).createCriteria(
		"aluno").add(Restrictions.ilike("nome", "rodr%")).createCriteria("disciplina").add(
		Restrictions.ilike("nome", "eng%")).list();

está dando essa exception:

Exception in thread "main" org.hibernate.QueryException: could not resolve property: disciplina of: br.edu.unijales.sga.modelo.academico.Aluno
	at org.hibernate.persister.entity.AbstractPropertyMapping.throwPropertyException(AbstractPropertyMapping.java:43)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:37)
	at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1265)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathEntityName(CriteriaQueryTranslator.java:204)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:191)
	at org.hibernate.loader.criteria.CriteriaQueryTranslator.<init>(CriteriaQueryTranslator.java:81)
	at org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:58)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)
	at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	at org.hibernate.impl.CriteriaImpl$Subcriteria.list(CriteriaImpl.java:458)
	at br.edu.unijales.sga.util.Teste.main(Teste.java:37)
plentz

facholi:
olha só o que quero fazer:

List<Boletim> boletins = factory.getSession().createCriteria(Boletim.class).createCriteria( "aluno").add(Restrictions.ilike("nome", "rodr%")).createCriteria("disciplina").add( Restrictions.ilike("nome", "eng%")).list();

Sim, você está adicionando uma criteira na criteria de alunos, não na de boletim. Tente assim

Criteria criteira = factory.getSession().createCriteria(Boletim.class).createCriteria(
		"aluno").add(Restrictions.ilike("nome", "rodr%"));
criteria.createCriteria("disciplina").add(
		Restrictions.ilike("nome", "eng%"));
List<Boletim> boletins = criteria.list();
facholi

entendi! obrigado plentz, obrigado LIPE, valeu galera

braudes

Gostaria de saber se tem como utilizar subcriteria juntamente com Projections para que a consulta retorne sometne determinados atributos da classe preenchidos. Ex.:

Criteria criteria = session.createCriteria(Empresa.class,"empresa");
		criteria.setProjection(Projections.projectionList().add(
				Projections.property("id")).add(
				Projections.property("versao")));

		Criteria subCriteria = criteria.createCriteria("pessoaJuridica");
		subCriteria.setProjection(Projections.projectionList().add(Projections.property("nome")));

		return criteria.list();

Esta dando a seguinte exceção:

org.hibernate.QueryException: could not resolve property: nome of: br.com.evoluti.sig.entidade.geral.Empresa

Empresa tem id, versao, pessoaJuridica e outros atributos. PessoaJuridica tem id, versao, nome e etc. Gostaria de trazer todas as empresas (filtradas pelo - isso eh um segundo passo) com os atributos id, versao e pessoaJuridica.nome preenchidos para melhorar performance.

toninhocell

Pessoal tenho que fazer uma consulta semelhante a trabalhada por vcs aqui mas mesmo utilizando a subcriteria o treco nao está funcionando. Cheguei até a criar este tópico http://guj.com.br/posts/list/95125.java na tentativa de conseguir alguma ajuda, mas nada até então. Minha questão é a seguinte, tenho que restringir os sub-registros de um consulta, ou seja, tenho lotes e itens dele, quero selecionar o lote e todos os itens dele que tenham status igual a 6 por exemplo.

Espero poder contar com a ajuda de vcs!

Abraço a todos… :smiley:

Criado 20 de novembro de 2006
Ultima resposta 26 de jun. de 2008
Respostas 6
Participantes 5