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

我有List dynamics 。 我希望使用Collections获得最大结果。 这是我的代码:

 List dynamics=spyPathService.getDynamics(); Long max=((Long)Collections.max(dynamics)).longValue(); 

这是我的getDynamics

 public List getDynamics() { Session session = null; session = this.sessionFactory.getCurrentSession(); Query query = session .createSQLQuery("SELECT COUNT(*) FROM SpyPath WHERE DATE(time)>=DATE_SUB(CURDATE(),INTERVAL 6 DAY) GROUP BY DATE(time) ORDER BY time;"); List result = query.list(); return result; } 

现在我得到java.math.BigInteger cannot be cast to java.lang.Long 。 怎么了?

您的错误可能在此行中:

 List result = query.list(); 

其中query.list()返回BigInteger列表而不是Long列表。 尝试将其更改为。

 List result = query.list(); 

更好的选择是使用SQLQuery#addScalar而不是强制转换为LongBigDecimal

这是修改后的查询,将count列返回为Long

 Query query = session .createSQLQuery("SELECT COUNT(*) as count FROM SpyPath WHERE DATE(time)>=DATE_SUB(CURDATE(),INTERVAL 6 DAY) GROUP BY DATE(time) ORDER BY time;") .addScalar("count", LongType.INSTANCE); 

然后

 List result = query.list(); //No ClassCastException here 

相关链接

  • Hibernate javadocs
  • 标量查询
  • Hibernate.LONG ,记得它自Hibernate版本3.6.X以来已被弃用
    这是不推荐使用的文档 ,因此您必须使用LongType.INSTANCE
  • 我以前的回答

尝试将BigInteger转换为这样的长度

 Long longNumber= bigIntegerNumber.longValue(); 

我缺乏上下文,但这工作得很好:

 List nums = new ArrayList(); Long max = Collections.max(nums).longValue(); // from BigInteger to Long... 

您需要为查询添加计数的别名,然后使用addScalar()方法作为Hibernate接缝中的list()方法的默认值,将其作为数字SQL类型的BigInteger 。 这是一个例子:

 List sqlResult = session.createSQLQuery("SELECT column AS num FROM table") .addScalar("num", StandardBasicTypes.LONG).list(); 

你确定动态是List而不是List吗?

如果动态是List ,则不需要执行转换(Long)

想象一下d.getId是一个Long,然后像这样换行:

 BigInteger l = BigInteger.valueOf(d.getId());