Funcao SUM com Hibernate

4 respostas
L

E ai galera!! Estou precisando fazer uma consulta no banco retornando a soma de determinado campo numa tabela, no caso é uma tabela Venda, somando o total delas em um determinado período de tempo. Isso utilizando Hibernate com annotions e EntityManager.
Tentei fazer com sql normal assim:

public static void pesquisaValorVenda(String idVenda, Date dateIncio, Date dateFim) {
		Object object = null;

		EntityManager entityManager = HibernateFactory.getEntityManager();

		Query query = entityManager.createQuery("select sum(total_venda) from Venda where data between ? and ? and idvenda =? ");
		query.setParameter(1, dateInicio);
                query.setParameter(2, dateFim);
		query.setParameter(3, idVenda);
		object = query.getSingleResult();

		entityManager.close();

		return object;
	}

Mas da erro dizendo que não reconhece a funcao sum passada.
Alguém sabe a maneira correta de fazer ou onde estou fazendo errado?
Conto com a ajuda da galera ai.

4 Respostas

L

cara,

pode parecer besteira mas nao custa tentar.
ja aconteceu comigo.

Tenta colocar Sum com ‘S’ maiusculo. Ok?

E

Leandro,

Poe o stacktrace aqui pra gente te ajudar melhor.

Eduardo

T

Isso é SQL, não EJB3-QL. Um exemplo no site do hibernate mostra como fazer com MIN; SUM é semelhante.

http://www.hibernate.org/hib_docs/entitymanager/reference/en/html/objectstate.html#d0e739

L

Bom dia galera! Sei que já faz alguns dias que iniciei o post, mas é que passei o fim de semana todo tentando resolver o problema e nada. Baseado no link que o thingol passou fiz varios testes, alguns com sucesso, mas justamente o campo que preciso buscar nao obtive sucesso. Estou utilizando como SGDB o Postgresql.
Quando não utilizo alias na pesquisa consiguo realizar as funções count e sum nos meus campos de tabela sem ( _ ) tipo: alorbruto. Mas quando uso com alias só consiguo fazer count nos campo com ( _ ) tipo: valor_venda.
Erro ocorrido com alias:

Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: venda_pa of: com.cliqueaqui.libanori.model.beans.Produto [select sum(vend.venda_pa) from com.cliqueaqui.libanori.model.beans.Produto vend ]
	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:617)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:96)
	at com.cliqueaqui.libanori.model.dataacess.DAO.pesquisarValorVendaPorData2(DAO.java:700)
	at com.cliqueaqui.libanori.model.dataacess.DAO.main(DAO.java:715)
Caused by: org.hibernate.QueryException: could not resolve property: venda_pa of: com.cliqueaqui.libanori.model.beans.Produto [select sum(vend.venda_pa) from com.cliqueaqui.libanori.model.beans.Produto vend ]
	at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:44)
	at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:38)
	at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1358)
	at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:279)
	at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:386)
	at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:566)
	at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:241)
	at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:188)
	at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:94)
	at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:90)
	at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:728)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1216)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.aggregateExpr(HqlSqlBaseWalker.java:2898)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.functionCall(HqlSqlBaseWalker.java:2346)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:1963)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1825)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1394)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:553)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:93)
	... 2 more

Erro ocorrido sem alias:

Exception in thread "main" java.lang.NullPointerException
	at org.hibernate.dialect.Dialect$3.getReturnType(Dialect.java:102)
	at org.hibernate.hql.ast.util.SessionFactoryHelper.findFunctionReturnType(SessionFactoryHelper.java:382)
	at org.hibernate.hql.ast.tree.AggregateNode.getDataType(AggregateNode.java:21)
	at org.hibernate.hql.ast.tree.SelectClause.initializeExplicitSelectClause(SelectClause.java:143)
	at org.hibernate.hql.ast.HqlSqlWalker.useSelectClause(HqlSqlWalker.java:705)
	at org.hibernate.hql.ast.HqlSqlWalker.processQuery(HqlSqlWalker.java:529)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:645)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
	at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:93)
	at com.cliqueaqui.libanori.model.dataacess.DAO.pesquisarValorVendaPorData2(DAO.java:700)
	at com.cliqueaqui.libanori.model.dataacess.DAO.main(DAO.java:715)

Função utilizada;

public static void pesquisarValorVendaPorData2() {
		

		
			EntityManager entityManager = HibernateFactory.getEntityManager();

			
			Iterator results = entityManager.createQuery(
			        "select count(vend.quantidade_parcela) from Venda vend ")
			        .getResultList()
			        .iterator();

			while ( results.hasNext() ) {
			    Object row = results.next();
			    Long type = (Long) row;
			    System.out.println(" Soma teste "+type);
			    
			}
	
	}

Alguém tem alguma idéia de onde possa estar o erro, já testei de várias formas possíveis e não encontro soluçãs lógica para a situação.
Obrigado.

Criado 8 de fevereiro de 2008
Ultima resposta 12 de fev. de 2008
Respostas 4
Participantes 4