java.lang.ClassCastException:java.math.BigInteger无法强制转换为java.lang.Long

时间:2013-08-13 20:19:17

标签: java sql long-integer

我想使用本机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);


    }

3 个答案:

答案 0 :(得分:12)

使用BigInteger#longValue()方法,而不是将其投放到Long

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

似乎firstResult.get(0)会返回Object。一种选择是强制转换为BigInteger

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

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

答案 1 :(得分:2)

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

我们遇到了问题,

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

这些将返回一个Object数组列表(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 <以来它已被弃用登记/> Here is the deprecated document,因此您必须使用LongType.INSTANCE

相关链接

答案 2 :(得分:2)

  String query ="select count(*) from tablename";       
  Number count = (Number) sessionFactory.getCurrentSession().createSQLQuery(query).uniqueResult();
  Long value = count.longValue();

我试过了,效果很好