【问题标题】:java.math.BigInteger cannot be cast to java.lang.Longjava.math.BigInteger 不能转换为 java.lang.Long
【发布时间】:2013-08-24 01:39:14
【问题描述】:

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

【问题讨论】:

  • 我想说你正在尝试将 BigInteger 转换为 Long
  • 因为java.math.BigInteger 类实例不是java.lang.Long 类的实例。
  • 如果您需要更多帮助,您将需要提供更多代码。也许错误指向的行? getDynamics() 返回什么类型?
  • 你在你的问题中有你的答案,我假设这个Collections.max(dynamics))BigInteger,你正在尝试将它转换为长,尝试将它转换为BigInteger,然后使用@987654334 @方法
  • 好吧,他已经清楚地将他的动态列表标记为List&lt;Long&gt;。 @Tony 检查spyPathService.getDynamics() 的返回类型。假设您的错误实际上来自这些代码行,我会从这段代码中猜测 spyPathService.getDynamics() 实际上返回的 List 至少包含一些 BigIntegers

标签: java hibernate collections long-integer biginteger


【解决方案1】:

您确定动态是List&lt;Long&gt; 而不是List&lt;BigInteger&gt; 吗?

如果 dynamics 是 List&lt;Long&gt;,则不需要对 (Long) 进行强制转换

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 听说COUNT(*) 语句返回Long。不是吗?
    【解决方案3】:

    你的错误可能在这一行:

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

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

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

    【讨论】:

    • 正如@StormeHawke 所说'...实际上返回的列表至少包含一些 BigIntegers'。因此,您最好在遇到下一个此类问题之前找出确切的答案。
    • 这个答案基于对内部 Hibernate 包装器类型的错误假设!唯一的 Aniket Kulkarni 答案 SQLQuery#addScalar 是对的!
    • 我也键入 cast the list
    【解决方案4】:

    尝试将 BigInteger 转换为这样的 long

    Long longNumber= bigIntegerNumber.longValue();
    

    【讨论】:

      【解决方案5】:

      使用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,但实际上是 +100!
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 2016-07-26
            • 2023-04-03
            • 2019-02-27
            • 2013-01-07
            • 2012-03-19
            • 1970-01-01
            • 1970-01-01
            • 2015-05-29
            • 1970-01-01
            相关资源
            最近更新 更多