例如,如果我们有一个表Books,我们如何用hibernate计算图书记录的总数?
你可以试试count(*)
count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
其中Books是class的名称-而不是数据库中的表。
Books
class
对于Hibernate (<5.2)的旧版本:
假设类名为Book:
return (Number) session.createCriteria("Book") .setProjection(Projections.rowCount()) .uniqueResult();
它至少是Number,很可能是Long。
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。
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并获得int或long,这取决于你希望统计的行数。
BigInteger
int
long