如何使用旧版本的Hibernate(~2009)来计算行数?

例如,如果我们有一个表Books,我们如何用hibernate计算图书记录的总数?

247966 次浏览

你可以试试count(*)

Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();

其中Booksclass的名称-而不是数据库中的表。

对于Hibernate (<5.2)的旧版本:

假设类名为Book:

return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();

它至少是Number,很可能是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

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();

这在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,因此为了可移植性,最好转换为Number并获得intlong,这取决于你希望统计的行数。