Например, если у нас есть таблица 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, в зависимости от того, сколько строк вы ожидаете подсчитать.