Risposte:
Per le versioni precedenti di Hibernate (<5.2):
Supponendo che il nome della classe sia Libro:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
È almeno un Number
, molto probabilmente un Long
.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
In Java di solito ho bisogno di restituire int e utilizzare questo modulo:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Ecco cosa ci dicono i documenti ufficiali di ibernazione su questo:
Puoi contare il numero di risultati della query senza restituirli:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Tuttavia, non restituisce sempre Integer
istanza, quindi è meglio utilizzarlo java.lang.Number
per sicurezza.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
( StandardBasicTypes.LONG )
Potresti provare count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Dove si Books
trova il nome accanto a class
- non la tabella nel database.
Se si utilizza Hibernate 5+, la query verrà modificata come
Long count = session.createQuery("select count(1) from Book")
.getSingleResult();
O se hai bisogno di TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Funziona in Hibernate 4 (testato).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Dove getCurrentSession () è:
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
È molto semplice, basta eseguire la seguente query JPQL:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Il motivo per cui stiamo eseguendo il casting Number
è che alcuni database torneranno Long
mentre altri torneranno BigInteger
, quindi per motivi di portabilità è meglio eseguire il casting su un Number
e ottenere un int
o un long
, a seconda di quante righe si prevede di essere conteggiate.