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 Integeristanza, quindi è meglio utilizzarlo java.lang.Numberper sicurezza.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.LONG )
Potresti provare count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Dove si Bookstrova 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 Longmentre altri torneranno BigInteger, quindi per motivi di portabilità è meglio eseguire il casting su un Numbere ottenere un into un long, a seconda di quante righe si prevede di essere conteggiate.