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.