Как мы подсчитываем строки с помощью 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 - не таблица в базе данных.


Long count = (Long) session.createQuery("select count(*) from Book") .uniqueResult();


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