4

我想使用本机 sql 返回行数。但控制台说我java.math.BigInteger cannot be cast to java.lang.Long。怎么了?这是我的方法:

public Long getNumRows(Integer id){

        Session session = null;

        session = this.sessionFactory.getCurrentSession();
        Query query = session
                .createSQLQuery("SELECT COUNT(*) FROM controllnews WHERE news_id="
                        + id + ";");
        List firstResult = query.list();

        return (Long) firstResult.get(0);


    }
4

3 回答 3

12

使用BigInteger#longValue()方法,而不是将其转换为Long

return firstResult.get(0).longValue();

似乎firstResult.get(0)返回一个Object. 一种选择是将类型转换为BigInteger

return ((BigInteger)firstResult.get(0)).longValue();

但不要这样做。而是使用 Nambari 在评论中提供的方式。我不是 Hibernate 的用户,所以我不能提供 Hibernate 特定的解决方案。

于 2013-08-13T20:20:34.503 回答
4

我遇到了同样的问题,我按照@Rohit Jain's answer的评论中的建议使用了 Hibernate Scalar 查询。感谢@nambari的评论。

来到我们遇到的问题,

Query query = session
            .createSQLQuery("SELECT COUNT(*) FROM controllnews WHERE news_id="
                    + id + ";");  

这些将返回一个对象数组列表 (Object[]),其中包含controllnews表中每一列的标量值。Hibernate 将使用 ResultSetMetadata 来推断返回的标量值的实际顺序和类型。

为了避免使用 ResultSetMetadata 的开销,或者只是为了更明确地返回返回的内容,可以使用addScalar():

Query query = session
            .createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id="
                    + id + ";").addScalar("count", LongType.INSTANCE);  

这将返回 Object 数组,但现在它不会使用 ResultSetMetadata 而是显式地从底层结果集中 获取count列。Long

从 ResultSetMetaData 返回的如何java.sql.Types映射到 Hibernate 类型由 Dialect 控制。如果特定类型没有被映射,或者没有产生预期的类型,则可以通过调用registerHibernateType方言来自定义它。


您可以使用Query#setParameter方法来避免查询中的任何错误

Query query = session
           .createSQLQuery("SELECT COUNT(*) as count FROM controllnews WHERE news_id= :id")
           .addScalar("count", LongType.INSTANCE).setParameter("id",id);  

当您参考Scalar queries docs 4.0时的一个困惑,addScalar方法有第二个参数Hibernate.LONG,请记住它自 Hibernate 版本 3.6.X 以来已被弃用
这是弃用的文档,因此您必须使用LongType.INSTANCE

相关链接

于 2013-11-13T09:34:52.400 回答
4
  String query ="select count(*) from tablename";       
  Number count = (Number) sessionFactory.getCurrentSession().createSQLQuery(query).uniqueResult();
  Long value = count.longValue();

我试过这个效果很好

于 2019-08-14T09:43:14.513 回答