Max value hibernate

11 respostas
F

To fazendo um select tentando pegar o ultimo codigo na tabela, como jogo isso em um inteiro para retornar?

public int getMaxIdInscricao(){
           	Session sessao = HibernateUtility.getSession();
		Transaction tx = sessao.beginTransaction();
		int i;
		Query select = sessao.createQuery("select max(ev.INS_ID) from TB_EVENTOS as ev");
		tx.commit();
		sessao.close();
			
    }

11 Respostas

E

olá santiago, tenta assim

public int getMaxIdInscricao(){
            	Session sessao = HibernateUtility.getSession();
 		Transaction tx = sessao.beginTransaction();

		Integer max = (Integer) sessao.createQuery("select max(ev.INS_ID) as maximo from TB_EVENTOS as ev");
		
 		tx.commit();
 		sessao.close();
 		
		if(max != null) return max.intValue();
		return 0;
     }
C

Olá colega... o retorno da Query é um List de Object[]. Neste caso tu vai
fazer:

Query select = sessao.createQuery("select max(ev.INS_ID) from TB_EVENTOS as ev");

List result = select.list();
Iterator itResult = result.iterator;

while(itResult.hasNext()){
    Object []  o = (Object [])  itResult.next();   
Integer max = o[0];
}

Neste caso tua list vai ter um unico element, então você pode usar o método uniqueResult() ao invés de list() . Coloquei as duas formas pra te mostrar como iterar o resultado, pois pelo que vi vc não sabia.

[]1s clodoaldoJR

F

Brigado Clodoaldo... mas ta dando um errinho de conversao ainda...

[code]
canot convert from object to integer
[quote]

L

Segue um exemplo utilizando SQLQuery:

Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
.addScalar("maxWeight", Hibernate.DOUBLE)
.uniqueResult();

Este exemplo está na página 153 da Hibernate Reference Documentation, Version: 3.0.5

Obs.: Para fazer uma consulta, não é necessário iniciar e finalizar uma transação.

[]s

Leandro

P

Leandro , ainda está com um pequeno erro . addScalar("maxWeight", Hibernate.DOUBLE)

não encontrou o Hibernate.DOUBLE , será que faltou algim import ?
grato

L

Se você estiver usando o Eclipse, basta utilizar o (shift+ctrl+o). Se não

import org.hibernate.Hibernate;

[]s

Leandro

P

Fiz desta forma , compilou normalmente , só que o problema é que de o seguinte erro , nao executou a query :

org.hibernate.exception.SQLGrammarException: could not execute query
	org.hibernate.exception.ErrorCodeConverter.convert(ErrorCodeConverter.java:70)
	org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
	org.hibernate.loader.Loader.doList(Loader.java:1596)
	org.hibernate.loader.Loader.list(Loader.java:1577)
	org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:112)
	org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1414)
	org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:153)
	org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:603)
	hibernate.TbEventosFacade.getMaxIdInscricao(TbEventosFacade.java:93)
	struts.InserirEventoAction.execute(InserirEventoAction.java:57)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
L

Dê uma olhada no SQL que foi gerado no log.

[]s

Leandro

P

foi um SQL exatemente igual
deu um erro de nome de coluna inválido , mas a coluna existe nesta tabela , e este select funciona perfeitamente pelo SQL navigator

select max(EVE_ID) from TB_EVENTOS
P

sera que eu posso utilizar o crateQuery em vez do createSQLQuery ? meus outros métodos funcionaram desta forma
grato

B

Galera, teria como fazer o select max mais genérico, tipo eu poderia fazer assim

public Long SqlMax(String campo,tabela){
        Session session =  HibernateUtil.getSessionFactory().openSession();
        
        sql = "select max("+campo+") from "+tabela+""
                
                Long cd = (Long) session.createQuery(sql).uniqueResult();
        
        if (cd != null) {
            return cd;
        } else
            return 0;
        return 0;
        
    }

Mas dessa forma, podem acontecer erros, pois o programador pode passar o nome da tabela errada ou fora de case sensitive.

Teria alguma forma de fazer

public Long SqlMax(Entity tabela, Column campo){
        Session session =  HibernateUtil.getSessionFactory().openSession();
        
        sql = "select max("+campo+") from "+tabela+""
                
                Long cd = (Long) session.createQuery(sql).uniqueResult();
        
        if (cd != null) {
            return cd;
        } else
            return 0;
        return 0;
        
    }

Dessa forma na hora de chamar o método só é permitido passar classes e campos que realmente existem, diminuindo a chance de erros.
Alguém??

Criado 24 de julho de 2006
Ultima resposta 12 de set. de 2008
Respostas 11
Participantes 6