Respuestas:
Para versiones anteriores de Hibernate (<5.2):
Suponiendo 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
.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
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 hibernación nos dicen 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 Integer
instancia, por lo que es mejor usarlo java.lang.Number
por seguridad.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
( StandardBasicTypes.LONG )
Tu podrías intentar count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
¿Dónde Books
está el nombre fuera de 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();
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 enviando Number
es que algunas bases de datos regresarán, Long
mientras que otras regresarán BigInteger
, por lo que por razones de portabilidad, es mejor que envíe a Number
y obtenga un int
o a long
, dependiendo de cuántas filas espera contar.