¿Cómo contamos las filas usando Hibernate?

Por ejemplo, si tenemos una tabla Libros, ¿cómo contaríamos el número total de registros de libros con hibernación?

Suponiendo que el nombre de clase es Libro:

return (Number) session.createCriteria("Book") .setProjection(Projections.rowCount()) .uniqueResult(); 

Es al menos un Number , muy probablemente un Long .

En Java, generalmente necesito devolver int y usar este formulario:

 int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue(); 

Esto es lo que los documentos oficiales de Hibernate nos dicen sobre esto:

Puede contar la cantidad de resultados de la consulta sin devolverlos:

 ( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue() 

Sin embargo, no siempre devuelve la instancia de Integer , por lo que es mejor usar java.lang.Number para mayor seguridad.

Podría intentar count(*)

 Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult(); 

Where Books es el nombre de la class , no la tabla en la base de datos.

Long count = (Long) session.createQuery("select count(*) from Book") .uniqueResult();

Si está utilizando Hibernate 5+, la consulta se modificará como

 Long count = session.createQuery("select count(1) from Book") .getSingleResult(); 

O si necesita TypedQuery

 Long count = session.createQuery("select count(1) from Book",Long.class) .getSingleResult(); 

Esto funciona en Hibernate 4 (Probado).

 String hql="select count(*) from Book"; Query query= getCurrentSession().createQuery(hql); Long count=(Long) query.uniqueResult(); return count; 

Donde getCurrentSession () es:

 @Autowired private SessionFactory sessionFactory; private Session getCurrentSession(){ return sessionFactory.getCurrentSession(); } 

Es muy fácil, solo ejecute la siguiente consulta JPQL:

 int count = ( (Number) entityManager .createQuery( "select count(b) " + "from Book b") .getSingleResult() ).intValue(); 

La razón por la que estamos recurriendo a Number es que algunas bases de datos devolverán Long mientras que otras devolverán BigInteger , por lo que, para mayor portabilidad, es mejor que transfieras a un Number y obtengas una int o una long , dependiendo de cuántas filas estás esperando contado