Например, если у нас есть таблица Books, как бы мы подсчитали общее количество книжных записей в спящем режиме?
Как мы подсчитываем строки, используя более старые версии Hibernate (~ 2009)?
Ответ 1
Для более старых версий Hibernate (<5.2):
Предполагая, что имя класса - Book:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
Это по крайней мере Number
, скорее всего, Long
.
Ответ 2
В Java мне обычно нужно возвращать int и использовать эту форму:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Ответ 3
Вот что официальные hibernate docs рассказывают об этом:
Вы можете подсчитать количество результатов запроса, не возвращая их:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Однако он не всегда возвращает экземпляр Integer
, поэтому лучше использовать java.lang.Number
для обеспечения безопасности.
Ответ 4
Вы можете попробовать count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Где Books
- это имя вне class
не таблица в базе данных.
Ответ 5
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Ответ 6
Если вы используете Hibernate 5+, запрос будет изменен как
Long count = session.createQuery("select count(1) from Book")
.getSingleResult();
Или, если вам нужен TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
Ответ 7
Это работает в Hibernate 4 (проверено).
String hql="select count(*) from Book";
Query query= getCurrentSession().createQuery(hql);
Long count=(Long) query.uniqueResult();
return count;
Где getCurrentSession():
@Autowired
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
Ответ 8
Это очень просто, просто запустите следующий запрос JPQL:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Причина, по которой мы приводим Number
заключается в том, что некоторые базы данных возвращают Long
а другие возвращают BigInteger
, поэтому для удобства переносимости вам лучше привести к Number
и получить int
или long
, в зависимости от того, сколько строк вы ожидаете получить. подсчитаны.