我有List<Long> dynamics
。我希望使用Collections
获得最大结果。这是我的代码:
List<Long> dynamics=spyPathService.getDynamics();
Long max=((Long)Collections.max(dynamics)).longValue();
这是我的getDynamics
:
public List<Long> 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<Long> result = query.list();
return result;
}
现在我得到了java.math.BigInteger cannot be cast to java.lang.Long
。怎么了?
答案 0 :(得分:28)
更好的选择是使用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<Long> result = query.list(); //No ClassCastException here
相关链接
Hibernate.LONG
,请记住自Hibernate版本3.6.X以来已被弃用 LongType.INSTANCE
答案 1 :(得分:21)
您的错误可能在此行中:
List<Long> result = query.list();
其中query.list()返回BigInteger列表而不是Long列表。尝试将其更改为。
List<BigInteger> result = query.list();
答案 2 :(得分:4)
尝试将BigInteger转换为像这样的长
Long longNumber= bigIntegerNumber.longValue();
答案 3 :(得分:2)
我缺乏背景,但这很好用:
List<BigInteger> nums = new ArrayList<BigInteger>();
Long max = Collections.max(nums).longValue(); // from BigInteger to Long...
答案 4 :(得分:1)
您需要为查询添加计数别名,然后将addScalar()
方法用作Hibernate接缝中list()
方法的默认值,以便BigInteger
用于数字SQL类型。这是一个例子:
List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table")
.addScalar("num", StandardBasicTypes.LONG).list();
答案 5 :(得分:0)
您确定动态是List<Long>
而不是List<BigInteger>
吗?
如果动态是List<Long>
,则不需要对(长)
答案 6 :(得分:0)
想象一下d.getId是一个Long,然后像这样包裹:
BigInteger l = BigInteger.valueOf(d.getId());
答案 7 :(得分:0)
这是一个非常古老的文章,但是如果它有益于任何人,我们可以做这样的事情:
graph_tool.libgraph_tool_core.Vertex