Respostas:
Para versões mais antigas do Hibernate (<5.2):
Supondo que o nome da classe seja Livro:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
É pelo menos um Number, provavelmente um Long.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
Em Java, geralmente preciso retornar int e usar este formulário:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Aqui está o que os documentos oficiais do hibernate nos dizem sobre isso:
Você pode contar o número de resultados da consulta sem retorná-los:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
No entanto, nem sempre ele retorna a Integerinstância, portanto, é melhor usá-lo java.lang.Numberpor segurança.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction( StandardBasicTypes.LONG )
Você poderia tentar count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Onde Booksestá o nome fora da class- não a tabela no banco de dados.
Se você estiver usando o Hibernate 5+, a consulta será modificada como
Long count = session.createQuery("select count(1) from Book")
.getSingleResult();
Ou se você precisar de TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Isso funciona no Hibernate 4 (testado).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Onde getCurrentSession () é:
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
É muito fácil, basta executar a seguinte consulta JPQL:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
A razão pela qual estamos lançando Numberé que alguns bancos de dados retornam Longenquanto outros retornam BigInteger, portanto, para maior portabilidade, é melhor converter para ae Numberobter uma intou a long, dependendo de quantas linhas você espera que sejam contadas.