首页 > 解决方案 > java- ClassCastException- BigInt 不能转换为 Long

问题描述

我的表中有两列是 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

标签: java

解决方案


只需查看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性能要低得多,因此只有在性能不是问题或者您绝对确定值会如此之大以至于这是绝对必要的情况下才使用它。


推荐阅读