JPA...ajuda em fazer metodo usando count(*) em um tabela

Olá,

estou tentando implementar o metodo abaixo pra retornar a qtde registros de uma tabela

mas me dá erro o que pode ser que está errado …

se alguém puder me ajudar …


 @SuppressWarnings("unchecked")
	public int count() throws DaoException {
    	
        List list = imsDBMng.getManager().createQuery(
                "select count(*) from " + domainClass.getName() + " x").getResultList();
        Integer count = (Integer) list.get(0);
        return count.intValue();
        
    	
    }

Então,

a query “SELECT COUNT(*) FROM NOME_DA_CLASSE_MODEL”, retorna um número,
e não uma lista de registros.
Portanto, troque seu método .getResultList() para getSingleResult();

Experimente desta forma:

[code] @SuppressWarnings(“unchecked”)
public int count() throws DaoException {

      return imsDBMng.getManager().createQuery("select count(*) from " + domainClass.getName()).getSingleResult();  

} [/code]

Qual erro?

Tente algo assim:

public int count() throws DaoException { Query query = imsDBMng.getManager().createQuery("select count(*) from " + domainClass.getName() + " x"); Integer count = (Integer) query.getSingleResult(); return count; }

[quote]Qual erro?

Tente algo assim:

  1. public int count() throws DaoException {
  2. Query query = imsDBMng.getManager().createQuery(“select count(*) from " + domainClass.getName() + " x”);
  3. Integer count = (Integer) query.getSingleResult();
  4. return count;
  5. } [/quote]

Pode ser também…
acho que está até mais correto que o meu, pois aqui se faz um “casting” para
Integer no resultado que a query traz

Use

no lugar de

Melhor performance.

Abraços!

o que fiz


@SuppressWarnings("unchecked")
	public int count() throws DaoException {
    	        return (Integer) imsDBMng.getManager().createQuery(
                "select count(0) from " + domainClass.getName() ).getSingleResult();
    	
    }

e deu esse erro



class = br.com.certisign.ims.data.model.device.ImsDeviceVendor
- line 1:14: unexpected token: 0
- processEqualityExpression() : No expression to process!
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: 0 near line 1, column 14 [select count(0) from br.com.certisign.ims.data.model.device.ImsDeviceVendor]
	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:624)
	at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:96)
	at br.com.certisign.core.persistence.AbstractBaseDao.count(AbstractBaseDao.java:143)
	at br.com.certisign.ims.data.persistence.teste.main(teste.java:199)
Caused by: org.hibernate.hql.ast.QuerySyntaxException: unexpected token: 0 near line 1, column 14 [select count(0) from br.com.certisign.ims.data.model.device.ImsDeviceVendor]
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:31)
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:24)
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
	at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:258)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)
	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

Para falar a verdade, nunca tinha testado no java;

Bom, agora já sei que não funciona!

Valeu pela dica.

Abraços!

Fiquei “encucado” com esse count(0) não funcionar, então fiz um teste com uma aplicação minha aqui

tenho uma tabela de Estados (27 estados)

entao fiz o seguinte metodo:

public Object pegarCount(){ Object total = null; EntityManager em = emf.createEntityManager(); try { Query query = em.createNativeQuery("select count(0) from itcd.itcd_uf"); total = query.getSingleResult(); System.out.println("Total: " + total); } catch (Exception e) { e.printStackTrace(); em.close(); } return total; }

Então ele me retornou assim:

run-single: [TopLink Info]: 2008.12.10 04:30:58.546--ServerSession(32019423)--TopLink, version: Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007)) [TopLink Info]: 2008.12.10 04:30:59.578--ServerSession(32019423)--file:/C:/Documents%20and%20Settings/AJFILHO/Meus%20documentos/NetBeansProjects/ITCD/build/classes/-ITCDPU login successful Total: [27] BUILD SUCCESSFUL (total time: 3 seconds)

Abraços!

o que fiz e deu certo li na documentação qdo usa count
sempre retorna um Long então


/**
	 * @see BaseDao#count() BaseDao.count()
	 */
    @SuppressWarnings("unchecked")
	public int count() throws DaoException {
    	Long resultado = new Long(0L);
    	Query query = em.createQuery("select count(e) from " + domainClass.getName()+" e" );
    	resultado = (Long) query.getSingleResult();
    	return resultado.intValue();
    }

}