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 Integer
Instanz zurückgegeben, daher ist es java.lang.Number
aus 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 Books
ist 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, Number
ist, dass einige Datenbanken zurückkehren, Long
während andere zurückkehren BigInteger
. Aus Gründen der Portabilität ist es daher besser, in ein Casting zu Number
wechseln und ein int
oder ein zu erhalten long
, je nachdem, wie viele Zeilen Sie zählen möchten.