Par exemple, si nous avons une table Livres, comment compterions-nous le nombre total d'enregistrements de livres en veille prolongée?
Pour les anciennes versions d'Hibernate (<5.2):
En supposant que le nom de la classe est Book:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
C'est au moins un Number
, très probablement un Long
.
En Java, je dois généralement retourner int et utiliser le formulaire suivant:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Voici ce que les documents officiels d'hibernation racontent nous à ce sujet:
Vous pouvez compter le nombre de résultats de la requête sans les renvoyer:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Cependant, elle ne renvoie pas toujours l'instance Integer
, il est donc préférable d'utiliser Java.lang.Number
pour des raisons de sécurité.
Vous pouvez essayer count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Où Books
est le nom du class
- pas la table de la base de données.
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Si vous utilisez Hibernate 5+, la requête sera modifiée comme suit:
Long count = session.createQuery("select count(1) from Book")
.getSingleResult();
Ou si vous avez besoin de TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
C'est très simple, lancez simplement la requête JPQL suivante:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
La raison pour laquelle nous appelons Number
est que certaines bases de données renverront Long
, tandis que d'autres renverront BigInteger
, il est donc préférable d'utiliser un Number
pour obtenir la portabilité. un int
ou un long
, selon le nombre de lignes que vous comptez compter.
Cela fonctionne dans Hibernate 4 (testé).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Où getCurrentSession () est:
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}