web-dev-qa-db-fra.com

Comment compte-t-on les lignes utilisant les anciennes versions d'Hibernate (~ 2009)?

Par exemple, si nous avons une table Livres, comment compterions-nous le nombre total d'enregistrements de livres en veille prolongée?

240
craftsman

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.

310
Salandur

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();
102
marioosh

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

43
Antonio

Vous pouvez essayer count(*)

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

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

12
Jon Spokes
Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();
6
xrcwrn

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();
6
rajadilipkolli

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.

1
Vlad Mihalcea

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
LucianoDemuru