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
.