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而不是强制转换为Long
或BigDecimal
。
这是修改后的查询,将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());