Как мы подсчитываем строки, используя более старые версии Hibernate (~ 2009)?

Например, если у нас есть таблица Books, как бы мы подсчитали общее количество книжных записей в спящем режиме?

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