Hibernate - Projections

7 respostas
T

Bom eu tenho a query abaixo que agrupa a quantidade de cursos por turno. Porém eu não encontrei uma maneira limpa de tratar o retorno dela.
Peguei uma lista e iterei, porém não consigo fazer o cast para turno nem para curso, como faço isso?

List resultados = (List) sessao.createCriteria(Curso.class, "cur")
	.createAlias("turno", "trn")
	.setProjection( Projections.projectionList()
		.add( Projections.rowCount() )
		.add( Projections.groupProperty("trn.id") )
		.add( Projections.property("trn.nome") ) )
	.list();
	
		
Iterator it = resultados.iterator();
while(it.hasNext())
{
	Object[] c = (Object[]) it.next();
	System.out.println(c[0]);
	System.out.println(c[2]);
}

Gostaria de saber também, como eu faço para limitar a quantidade de campos que eu quero que a query traga, exemplo, curso tem um monte de campos, mais eu só quero id e nome, como eu faço para limitar? tem que adicionar propertys?

Grato,
Thiago

7 Respostas

J

Tem certeza que isso ta retornando alguma coisa???

teu código nao temque ficar assim:

List resultados = (List) sessao.createCriteria(Curso.class, "cur")
 	.createAlias("turno", "trn")
 	.setProjection( Projections.projectionList()
 		.add( Projections.rowCount() )
                .add( Projections.property("trn.nome") ) 
                .add( Projections.groupProperty("trn.nome") ) 
 		.add( Projections.groupProperty("trn.id") )
 		)
 	.list();

aí dessa forma vc vai receber um objeto que tem o count
agrupado por nome e id

Aí se quer popular isso de uma vez só
inclui

.setResultTransformer(new AliasToBeanResultTransformer(SuaClass.class))

class SuaClass {
       Integer count;
       String nome;

       // getters e setters
     }

:wink:

boa sorte

[]´s

T

Ta retornando sim, e retornando um resultado valido, ou seja, coerente com minha query do banco, retorna o nome dos turnos (matutino,vespertino e noturno) e a quantidade de cursos nele.

Eu não preciso de 2 groupProperty, pois eu to agrupando pela chave estrangeira turno.id, e quero pegar o nome do turno e a quantidade.

List resultados = (List) sessao.createCriteria(Curso.class, "cur")
	.createAlias("turno", "trn")
	.setProjection( Projections.projectionList()
		.add( Projections.rowCount(),"qtd" )
		.add( Projections.property("trn.nome"), "nome" )
		.add( Projections.groupProperty("trn.id"),"id" )
         )
	.list();

Na verdade assim fica melhor, fica uma sequencia igual a do sql. o group por ultimo.

Queria saber se tinha outra maneira de retornar isso, tipo utilizando um Map, e pegando pelo alias que eu defini nas propriedades.

É preciso criar um class mesmo só para isso?

A

é só usar ResultTransformer, da uma olhada ai

J

Aí que ta se usar o ResultTransformer tem que criar uma classe
mas nessa classe as propriedades tem que ter o mesmo nome
que as alias que vc usou…
fica muito tranquilo…

[]'s

K

Não…, ele ta falando do ResultTransform ALIAS_TO_MAP (ou algo do tipo) ai ele retorna o resultado na forma de Map e não de Object[]… da uma lida na API que vc vai entender…

A

isso… tem um ResultTransformer que retorna um mapa exatamente da forma que voce quer

B

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

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

		Criteria subCriteria = criteria.createCriteria("pessoaJuridica");
		subCriteria.setProjection(Projections.projectionList().add(Projections.property("nome").as("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 nome - isso eh um segundo passo) com os atributos id, versao e pessoaJuridica.nome preenchidos para melhorar performance.

Criado 19 de maio de 2006
Ultima resposta 22 de out. de 2007
Respostas 7
Participantes 5