例如,如果我们有一个名为Books的表,我们如何使用Hibernate计算书籍记录的总数?
对于旧版本的Hibernate(<5.2):
假设类名为Book:
return (Number) session.createCriteria("Book")
.setProjection(Projections.rowCount())
.uniqueResult();
它至少是一个Number
,很可能是一个Long
。
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
。org.hibernate.dialect.function.StandardAnsiSqlAggregationFunctions.CountFunction
(StandardBasicTypes.LONG) 中找到。 - Guillaume Husta你可以尝试使用count(*)
Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
这里的 Books
是指一个类的名称,而不是数据库中的表。
Long count = (Long) session.createQuery("select count(*) from Book").uniqueResult();
Long count = (Long) session.createQuery("select count(1) from Book").uniqueResult();
这样可以提高性能。 - rajadilipkolliLong count = session.createQuery("select count(1) from Book")
.getSingleResult();
如果您需要 TypedQuery
Long count = session.createQuery("select count(1) from Book",Long.class)
.getSingleResult();
非常简单,只需运行以下JPQL查询:
int count = (
(Number)
entityManager
.createQuery(
"select count(b) " +
"from Book b")
.getSingleResult()
).intValue();
Number
,是因为一些数据库会返回 Long
而另一些会返回 BigInteger
,为了可移植性起见,您最好将其转换为 Number
并获取一个 int
或 long
,具体取决于您期望计数的行数。这在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();
}
return (Number) session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();
- bcmoney