27

我有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. 怎么了?

4

8 回答 8

34

更好的选择是使用SQLQuery#addScalar而不是强制转换为Longor 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  

相关链接

于 2013-11-28T10:48:02.200 回答
25

您的错误可能在这一行:

List<Long> result = query.list();

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

List<BigInteger> result = query.list();
于 2013-08-21T15:34:19.003 回答
14

尝试将 BigInteger 转换为这样的 long

Long longNumber= bigIntegerNumber.longValue();
于 2013-08-21T15:34:44.477 回答
3

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

List<BigInteger> nums = new ArrayList<BigInteger>();
Long max = Collections.max(nums).longValue(); // from BigInteger to Long...
于 2013-08-21T15:32:07.743 回答
3

这是一个非常古老的帖子,但如果它对任何人都有好处,我们可以这样做:

Long max=((BigInteger) Collections.max(dynamics)).longValue(); 
于 2019-11-29T08:47:17.597 回答
1

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

List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table")
    .addScalar("num", StandardBasicTypes.LONG).list();
于 2017-08-22T15:09:40.343 回答
0

你确定 dynamics 是 aList<Long>而不是List<BigInteger>

如果动力学是一个List<Long>你不需要做一个演员(长)

于 2013-08-21T15:31:04.637 回答
0

想象 d.getId 是一个 Long,然后像这样包装:

BigInteger l  = BigInteger.valueOf(d.getId());
于 2016-10-18T18:00:35.840 回答