Wenn wir beispielsweise eine Tabelle Bücher haben, wie würden wir die Gesamtzahl der Buchdatensätze im Ruhezustand zählen?
Wenn wir beispielsweise eine Tabelle Bücher haben, wie würden wir die Gesamtzahl der Buchdatensätze im Ruhezustand zählen?
Antworten:
Für ältere Versionen von Hibernate (<5.2):
Angenommen, der Klassenname lautet Buch:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
Es ist mindestens ein Number, höchstwahrscheinlich ein Long.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
In Java muss ich normalerweise int zurückgeben und dieses Formular verwenden:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Die offiziellen Dokumente zum Ruhezustand sagen uns Folgendes :
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 eine IntegerInstanz zurückgegeben, daher ist es java.lang.Numberaus Sicherheitsgründen besser, sie zu verwenden .
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.LONG )
Du könntest es versuchen count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Wo Booksist der Name von der class- nicht die Tabelle in der Datenbank.
Wenn Sie Hibernate 5+ verwenden, wird die Abfrage als 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();
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Dies funktioniert in Hibernate 4 (getestet).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Wo getCurrentSession () ist:
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
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, zu dem wir ein Casting durchführen, Numberist, dass einige Datenbanken zurückkehren, Longwährend andere zurückkehren BigInteger. Aus Gründen der Portabilität ist es daher besser, in ein Casting zu Numberwechseln und ein intoder ein zu erhalten long, je nachdem, wie viele Zeilen Sie zählen möchten.