Comment compter les lignes en utilisant Hibernate?
Par exemple, si nous avons un livre de table, comment compterions-nous le nombre total d'enregistrements de livres avec hibernate?
8 réponses
En supposant que le nom de la classe est Book:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
, Il est au moins un Number, probablement un Long.
En Java, j'ai généralement besoin de retourner int et d'utiliser ce formulaire:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Voici ce que docs hibernate officiels nous disent {[5] } à ce sujet:
Vous pouvez compter le nombre de résultats de requête sans les renvoyer:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Cependant, il ne retourne pas toujours l'instance Integer, Il est donc préférable d'utiliser java.lang.Number pour plus de sécurité.
Vous pouvez essayer de count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Où Books est le nom de la class - pas sur la table dans 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
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();
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();
}
C'est très facile, il suffit d'exécuter la requête JPQL suivante:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
La raison pour laquelle nous lançons à Number est que certaines bases de données retourneront Long tandis que d'autres retourneront BigInteger, donc pour des raisons de portabilité, vous feriez mieux de lancer un Number et d'obtenir un int ou un long, en fonction du nombre de lignes que vous attendez d'être comptées.