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

32

我有一个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
我觉得你正在尝试将一个 BigInteger 转换为一个 Long - Brian Roach
1
因为java.math.BigInteger类的实例不是java.lang.Long类的实例。 - Luiggi Mendoza
如果您想获得更多帮助,您需要提供更多的代码。也许是错误指向的那一行?getDynamics()返回什么类型? - Eric Stein
2
你在问题中已经得到了答案,我假设 Collections.max(dynamics))BigInteger,而你正在尝试将其转换为 long 类型,请尝试将其转换为 BigInteger,然后使用 longValue() 方法。 - user902383
2
大家好,他显然已将动态列表标记为List<Long>。@Tony,请检查spyPathService.getDynamics()的返回类型。假设你的错误确实来自这些代码行,我猜测从这段代码来看,spyPathService.getDynamics()实际上返回了一个包含至少一些BigInteger的列表。 - StormeHawke
9个回答

35
更好的选择是使用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<Long> result = query.list(); //No ClassCastException here  

相关链接


1
你是英雄!+1,但实际上应该是+100! - gavenkoa

26

您的错误可能在这行代码中:

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

查询语句query.list()返回一个BigInteger列表而不是Long列表。尝试将其更改为:

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

正如@StormeHawke所说:“实际上返回的是至少包含一些BigIntegers的列表”。因此,在遇到下一个类似问题之前,最好先弄清楚确切情况。 - mike
1
这个答案基于关于Hibernate内部包装类型的错误假设!唯一正确的答案是Aniket Kulkarni所提供的SQLQuery#addScalar - gavenkoa
我还将列表进行了类型转换。 - Bills

16
尝试像这样将 BigInteger 转换为 long:
Long longNumber= bigIntegerNumber.longValue();

3

我不知道具体背景,但这个工作很正常:

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

我听说 COUNT(*) 语句返回 Long 类型。是这样吗? - Tony

3

这是一篇很老的文章,但如果它对任何人有益,我们可以做类似于这样的事情:

Long max=((BigInteger) Collections.max(dynamics)).longValue(); 

1
你需要在查询中为计数添加别名,然后使用addScalar()方法作为Hibernate中list()方法的默认值,因为数字SQL类型的默认值似乎是BigInteger。这里是一个例子:
List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table")
    .addScalar("num", StandardBasicTypes.LONG).list();

1

您确定dynamics是List<Long>而不是List<BigInteger>吗?

如果dynamics是List<Long>,则不需要进行(Long)转换。


0

假设d.getId是一个Long类型的变量,那么可以这样包装:

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

0
你需要检索结果作为BigInteger列表,然后将其转换为Long集合。
List<BigInteger> ids = query.getResultList();
Set<Long> collect = ids.stream().map(id -> id.longValue()).collect(Collectors.toSet());

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