Например, если у нас есть таблица Books, как бы мы посчитали общее количество записей книги в режиме гибернации?
Например, если у нас есть таблица Books, как бы мы посчитали общее количество записей книги в режиме гибернации?
Ответы:
Для более старых версий Hibernate (<5.2):
Предполагая, что имя класса - Book:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
Это как минимум a Number
, скорее всего a Long
.
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
В Java мне обычно нужно вернуть int и использовать эту форму:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Вот что официальные документы по гибернации говорят нам об этом:
Вы можете посчитать количество результатов запроса, не возвращая их:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Однако он не всегда возвращает Integer
экземпляр, поэтому его лучше использовать java.lang.Number
для безопасности.
org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
( StandardBasicTypes.LONG )
Вы могли бы попробовать count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Где Books
имя от class
- не таблица в базе данных.
Если вы используете 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();
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Это работает в 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();
}
Это очень просто, просто запустите следующий запрос JPQL:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Причина, по которой мы приводим данные, Number
заключается в том, что некоторые базы данных возвращаются, Long
а другие - возвращаются BigInteger
, поэтому для удобства переноса вам лучше привести к типу a Number
и получить a int
или a long
, в зависимости от того, сколько строк вы ожидаете подсчитать.