java hibernate count

java - ¿Cómo contamos las filas usando versiones anteriores de Hibernate(~ 2009)?



select count hibernate (8)

En Java generalmente necesito devolver int y usar este formulario:

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

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


Es muy fácil, simplemente ejecuta la siguiente consulta JPQL:

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

La razón por la que estamos convirtiendo a Number es que algunas bases de datos devolverán Long mientras que otras devolverán BigInteger , por lo que, por el bien de la portabilidad, es mejor que conviertas un Number y obtengas un int o un long , dependiendo de cuántas filas esperes que sean. contado


Esto es lo que los documentos oficiales de hibernación nos cuentan sobre esto:

Puede contar el número 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 por seguridad.


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(); }


Podrías intentar count(*)

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

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


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

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

O si necesitas TypedQuery

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


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


Para versiones anteriores de Hibernate (<5.2):

Asumiendo que el nombre de la clase es Libro:

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

Es al menos un Number , muy probablemente un Long .