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?

235
demandé sur rajadilipkolli 2009-09-03 13:07:59

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.

304
répondu Salandur 2018-05-01 19:17:37

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();
100
répondu marioosh 2010-11-27 08:06:09

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é.

43
répondu Antonio 2016-02-23 09:27:34

Vous pouvez essayer de count(*)

Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();

Books est le nom de la class - pas sur la table dans la base de données.

12
répondu Jon Spokes 2018-08-13 00:09:40

Long count = (Long) session.createQuery("select count(*) from Book") .uniqueResult();

6
répondu xrcwrn 2015-03-16 05:53:10

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();
6
répondu rajadilipkolli 2017-06-11 07:41:33

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();
}
1
répondu LucianoDemuru 2018-03-14 10:48:26

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.

1
répondu Vlad Mihalcea 2018-06-27 06:11:23