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

cra*_*man 241 java hibernate count

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

Sal*_*dur 310

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

假设班级名称为Book:

return (Number) session.createCriteria("Book")
                  .setProjection(Projections.rowCount())
                  .uniqueResult();
Run Code Online (Sandbox Code Playgroud)

它至少是一个Number,很可能是一个Long.

  • 它返回一个长. (10认同)
  • 正如@Salandur建议的那样,"它至少是一个数字",并且Number类型具有"intValue()","longValue()"方法,因此我们可以轻松地获得所需的原始类型:((Number)criteria.uniqueResult ()).的intValue() (10认同)
  • 如果无法使用字符串参数找到实体映射到create criteria方法,则还可以使用session.createCriteria(Book.class) (5认同)
  • 就像@MontyBongo所说,我实际上必须像这样引用类:`return(Number)session.createCriteria(Book.class).setProjection(Projections.rowCount()).uniqueResult();` (5认同)
  • 那么你不应该使用理性的数据库;).最大值为9,223372037×1015⁸,这是laaaaaaaaarge (2认同)

mar*_*osh 102

在Java中,我通常需要返回int并使用以下形式:

int count = ((Long)getSession().createQuery("select count(*) from Book").uniqueResult()).intValue();
Run Code Online (Sandbox Code Playgroud)

  • 如果我们最终编写SQL代码,那么使用ORM有什么意义呢? (57认同)
  • 首先,这个解决方案不使用SQL,它是HQL.并使用count(*)代替'e e'中的'select count(e)或使用@EmbeddedId的标准和不支持元组计数的数据库(例如MySQL,其中查询如'select count((a,b)) )从table1'不起作用). (15认同)

Ant*_*nio 43

以下是官方hibernate文档告诉我们的内容:

您可以计算查询结果的数量而不返回它们:

( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
Run Code Online (Sandbox Code Playgroud)

但是,它并不总是返回Integer实例,因此最好使用java.lang.Number安全性.

  • 对我来说,这给了"java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Integer"但是转换为Long而不是工作... (3认同)
  • @rogerdpack这是因为Hibernate将返回的类型改为3.5到Long:https://community.jboss.org/wiki/HibernateCoreMigrationGuide35 (2认同)

Jon*_*kes 12

你可以试试 count(*)

Integer count = (Integer) session.createQuery("select count(*) from Books").uniqueResult();
Run Code Online (Sandbox Code Playgroud)

Books名称在哪里class- 而不是数据库中的表.


xrc*_*wrn 6

Long count = (Long) session.createQuery("select count(*) from  Book").uniqueResult();
Run Code Online (Sandbox Code Playgroud)


raj*_*lli 6

如果您使用的是Hibernate 5+,则查询将被修改为

Long count = session.createQuery("select count(1) from  Book")
                    .getSingleResult();
Run Code Online (Sandbox Code Playgroud)

或者如果你需要TypedQuery

Long count = session.createQuery("select count(1) from  Book",Long.class)
                        .getSingleResult();
Run Code Online (Sandbox Code Playgroud)