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 Integer
instância, portanto, é melhor usá-lo java.lang.Number
por 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 Books
está 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 Long
enquanto outros retornam BigInteger
, portanto, para maior portabilidade, é melhor converter para ae Number
obter uma int
ou a long
, dependendo de quantas linhas você espera que sejam contadas.