it-swarm.com.de

Wie zählen wir Zeilen mit älteren Versionen von Hibernate (~ 2009)?

Wenn wir beispielsweise eine Tabelle Bücher haben, wie würden wir die Gesamtzahl der Buchdatensätze mit Ruhezustand zählen?

240
craftsman

Für ältere Versionen von Hibernate (<5.2):

Angenommen, der Klassenname ist Buch:

return (Number) session.createCriteria("Book")
                  .setProjection(Projections.rowCount())
                  .uniqueResult();

Es ist mindestens ein Number, höchstwahrscheinlich ein Long.

310
Salandur

In Java muss ich normalerweise int zurückgeben und dieses Formular verwenden:

int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
102
marioosh

Hier ist was offizielle Hibernate-Dokumente erzählen uns dazu:

Sie können die Anzahl der Abfrageergebnisse zählen, ohne sie zurückzugeben:

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()

Es wird jedoch nicht immer die Instanz Integer zurückgegeben, daher ist es aus Sicherheitsgründen besser, Java.lang.Number Zu verwenden.

43
Antonio

Sie könnten versuchen count(*)

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

Wobei Books der Name aus dem class ist - nicht die Tabelle in der Datenbank.

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

Wenn Sie Hibernate 5+ verwenden, wird die Abfrage wie folgt geändert

Long count = session.createQuery("select count(1) from  Book")
                    .getSingleResult();

Oder wenn Sie TypedQuery benötigen

Long count = session.createQuery("select count(1) from  Book",Long.class)
                        .getSingleResult();
6
rajadilipkolli

Es ist sehr einfach, führen Sie einfach die folgende JPQL-Abfrage aus:

int count = (
(Number)
    entityManager
    .createQuery(
        "select count(b) " +
        "from Book b")
    .getSingleResult()
).intValue();

Der Grund, warum wir Number umwandeln, ist, dass einige Datenbanken Long zurückgeben, während andere BigInteger zurückgeben. Aus Gründen der Portabilität ist es daher besser, ein Number und ein int oder ein long abrufen, je nachdem, wie viele Zeilen gezählt werden sollen.

1
Vlad Mihalcea

Dies funktioniert in Ruhezustand 4 (Getestet).

String hql="select count(*) from  Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;

Wo ist getCurrentSession ():

@Autowired
private SessionFactory sessionFactory;


private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
1
LucianoDemuru