Consulta hibernate

9 respostas
D

Bom dia!

Estou com uma dúvida besta em hibernate :)

Não consigo pegar um valor inteiro de uma consulta do hibernate!! Alguém pode ajudar???

public Integer getTotalInformacoes(){
		
		Session session = MySQLDAOFactory.getSession();		
		Query query = session.createSQLQuery("select count(*) from informacoes");								
		
		return ((Integer) query.list().get(0)).intValue();	
		
		
	}

8:00:12,546 INFO BigIntegerType:182 - could not read column value from result set: ; Column '' not found.
Exception in thread "main" 08:00:12,609 WARN JDBCExceptionReporter:77 - SQL Error: 0, SQLState: S0022
08:00:12,609 ERROR JDBCExceptionReporter:78 - Column '' not found.
org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2214)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
at org.hibernate.loader.Loader.list(Loader.java:2090)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
at br.edu.fag.hello_hibernate.dao.InformacoesDAO.getTotalInformacoes(InformacoesDAO.java:54)
at br.edu.fag.hello_hibernate.Teste.main(Teste.java:16)
Caused by: java.sql.SQLException: Column '' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:961)
at com.mysql.jdbc.ResultSet.getBigDecimal(ResultSet.java:1226)
at org.hibernate.type.BigIntegerType.get(BigIntegerType.java:34)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:189)
at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:474)
at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:420)
at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:317)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:594)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2211)
... 8 more

9 Respostas

O

Ao invés de usar return ((Integer) query.list().get(0)).intValue();

Use return (Integer) query.uniqueResult();

Se não me engano o count() do Hibernate retorna um BigInteger.

D

Otávio! Fiz o que mandaste e deu o mesmo erro!

public BigInteger getTotalInformacoes(){
		
		Session session = MySQLDAOFactory.getSession();		
		Query query = session.createSQLQuery("select count(*) from informacoes");								
		
		return ((BigInteger) query.uniqueResult());	
		
		
	}

09:35:55,843 INFO BigIntegerType:182 - could not read column value from result set: ; Column '' not found.
09:35:55,875 WARN JDBCExceptionReporter:77 - SQL Error: 0, SQLState: S0022
09:35:55,875 ERROR JDBCExceptionReporter:78 - Column '' not found.
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not execute query
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.doList(Loader.java:2214)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
at org.hibernate.loader.Loader.list(Loader.java:2090)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:811)
at br.edu.fag.hello_hibernate.dao.InformacoesDAO.getTotalInformacoes(InformacoesDAO.java:55)
at br.edu.fag.hello_hibernate.Teste.main(Teste.java:16)
Caused by: java.sql.SQLException: Column '' not found.
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:910)
at com.mysql.jdbc.ResultSet.findColumn(ResultSet.java:961)
at com.mysql.jdbc.ResultSet.getBigDecimal(ResultSet.java:1226)
at org.hibernate.type.BigIntegerType.get(BigIntegerType.java:34)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:189)
at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:474)
at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:420)
at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:317)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:594)
at org.hibernate.loader.Loader.doQuery(Loader.java:689)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2211)
... 9 more

O que pode ser???

J

Ao invés de BigInteger, use Integer normal.

Eu usei isso a um tempo atrás e se eu não me engano era assim mesmo

Query query = getSession().createQuery("select count(*) from ALGUMA_ENTIDADE"); return (Integer) query.uniqueResult();

D

Olá Jair!

Agora aconteceu esse erro!!

Exception in thread main org.hibernate.hql.ast.QuerySyntaxException: informacoes is not mapped [select count(*) from informacoes]

at org.hibernate.hql.ast.util.SessionFactoryHelper.requireClassPersister(SessionFactoryHelper.java:158)

at org.hibernate.hql.ast.tree.FromElementFactory.addFromElement(FromElementFactory.java:87)

at org.hibernate.hql.ast.tree.FromClause.addFromElement(FromClause.java:70)

at org.hibernate.hql.ast.HqlSqlWalker.createFromElement(HqlSqlWalker.java:255)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3056)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688)

at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544)

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.(HQLQueryPlan.java:77)

at org.hibernate.engine.query.HQLQueryPlan.(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 br.edu.fag.hello_hibernate.dao.InformacoesDAO.getTotalInformacoes(InformacoesDAO.java:53)

at br.edu.fag.hello_hibernate.Teste.main(Teste.java:15)

A entidade relacional informacoes está sim mapeada.

O que pode ser???

Qual a diferença entre createQuery e createSQLQuery???

Obrigado

D

Alguém conseguiu rodar uma consulta dessa forma???

Eu não consigo…

J

createQuery é usado para criar HQL
createSQLQuery é usado para criar uma query SQL Nativa (eu acho).

Deu erro no seu mapeamento, verifique se o mesmo está correto, se está mapeado corretamente no arquivo hibernate.cfg.xml e etc.
Alias, coloque o código dos mapeamentos aqui para gente dar um olhada.

PS: eu já fiz uma consulta assim sem problemas

D
Ow Jair... desculpa pelo incomodo... Mas estou mandando meu factory abaixo:
package br.com.hello_hibernate.factory;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

import br.edu.fag.hello_hibernate.Bean.CadastroBean;
import br.edu.fag.hello_hibernate.Bean.InformacoesBean;

public final class MySQLDAOFactory {

	private static SessionFactory factory;
	
	static {
	
		AnnotationConfiguration cfg = new AnnotationConfiguration();
		
		cfg.addAnnotatedClass(CadastroBean.class);
		cfg.addAnnotatedClass(InformacoesBean.class);
		
	    factory = cfg.buildSessionFactory();	
	    
		
	}
	
	public static Session getSession(){				
		
		return factory.openSession();
		
	}
	
}

Estou adicionando a classe de bean InformacoesBean em annotation configuration, e logo abaixo segue o próprio bean:

package br.com.hello_hibernate.Bean;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity @Table(name="informacoes")
public class InformacoesBean {

	@Id @GeneratedValue
	private int id;
	private String informacao;
	private String data;

        [i]getters and setters[/i]	
	
}
J

Monta sua HQL assim então

select count(*) from InformacoesBean

A HQL não entende o nome da tabela e sim o nome da entidade (objeto). No seu caso, InformacoesBean.

D

Deu certo Jair.... Muito obrigado hein!!!!

mudei para Long o tipo do meu retorno do método:

public Long getTotalInformacoes(){
		
		Session session = MySQLDAOFactory.getSession();		
		Query query = session.createQuery("select count(*) from InformacoesBean");								
		
		return (Long) query.uniqueResult();			
		
	}
Criado 10 de março de 2009
Ultima resposta 10 de mar. de 2009
Respostas 9
Participantes 3