Как мы подсчитываем строки с помощью Hibernate?
например, если у нас есть настольные книги, как бы мы подсчитали общее количество книжных записей с помощью hibernate?
8 ответов
предполагая, что имя класса-книга:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
Это как минимум Number
, скорее всего a Long
.
в Java мне обычно нужно вернуть int и использовать эту форму:
int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
вот что официальные документы hibernate говорят об этом:
вы можете подсчитать количество результатов запроса, не возвращая их:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
однако он не всегда возвращается Integer
экземпляр, поэтому лучше использовать java.lang.Number
для безопасности.
вы могли бы попробовать 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();
это работает в спящем режиме 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
, Так что для переносимости ради вас лучше бросить в Number
и int
или long
в зависимости от того, сколько строк вы ожидаете, чтобы быть засчитан.