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

4

我想使用本地SQL返回行数。但是控制台告诉我java.math.BigInteger无法转换为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个回答

12

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

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

看起来firstResult.get(0)返回了一个Object。 一个选项是将其强制转换为BigInteger

看起来firstResult.get(0)返回了一个Object。 一个选项是将其强制转换为BigInteger
return ((BigInteger)firstResult.get(0)).longValue();

但是不要这样做。相反,使用评论中Nambari提供的方法。我不是Hibernate的用户,因此无法提供Hibernate特定的解决方案。


2
使用Hibernate Scalars http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/querysql.html - kosa
方法longValue()对于类型Object未定义。 - John Smith
1
你的答案不可行,因为firstResult.get(0)的返回类型是Object。 - kosa
1
@JohnSmith。虽然它能工作,但请研究一下Hibernate Scalars。这可能是最理想的方法。 - Rohit Jain
不错的技巧。似乎EntityManager没有像Hibernate一样的“标量”功能。 - oak
显示剩余2条评论

4
我遇到了同样的问题,我使用了Hibernate Scalar查询,正如@Rohit Jain答案的评论中建议的那样。感谢@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);  

这将返回对象数组,但现在它不会使用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);  

当您参考标量查询文档4.0时,addScalar方法的第二个参数是Hibernate.LONG,请记住自Hibernate版本3.6.X以来已被弃用
这里是废弃的文档,因此您必须使用LongType.INSTANCE

相关链接


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

我尝试了这个,它运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接