java- ClassCastException- BigInt无法转换为Long

时间:2019-04-05 04:39:46

标签: java

我的表中有两列是BigInt数据类型(NODEID和ULNODEID),我想保持这种状态。我正在为这些表使用MYSQL工作台8.0。

我想使用以下函数获取我的nodeid的值:

 public long get_urlnodeid(long nodeID) {
        try {


                String sql = "select NODEID from urllink where ULNODEID="+nodeID;
            if (em == null) {
                throw new Exception("could not found URL object.");
            }

            return (long) em.createNativeQuery(sql).getSingleResult();


        } catch (Exception e) {

            msg = CoreUtil.wrapMsg(CoreUtil.FUNC_ERROR,
                    this.getClass().getName(), "get", e.getMessage());

        }
        return 0;
    }

它抛出一个异常,说Big Integer cannot be cast to java.lang.Long

有什么方法可以将值保留在long中吗?

1 个答案:

答案 0 :(得分:3)

只需查看BigInteger的Java文档:

public long longValue()

  

将此BigInteger转换为long。此转换类似于Java™语言规范的5.1.3节中定义的从long到int的原始转换:如果此BigInteger太大而不能容纳long,则仅返回低阶64位。请注意,这种转换可能会丢失有关BigInteger值的整体大小的信息,并且会返回带有相反符号的结果。

所以您想要这样的东西:

return ((BigInteger)em.createNativeQuery(sql).getSingleResult()).longValue();

我建议添加一些类型检查。

-

如果您对应用程序有完全控制权,并且期望值超出long范围,那么另一个选择是让您的方法返回BigInteger而不是long

public BigInteger get_urlnodeid(long nodeID) {

并且:

return (BigInteger) em.createNativeQuery(sql).getSingleResult();

当然,然后,调用此方法的其余应用程序也必须与BigInteger一起使用。

请注意,使用BigInteger而不是long的效果要差得多,因此,只有在性能不成问题或您绝对确定值会太大而不能使用时,才使用它绝对必要。