java- ClassCastException- BigInt 不能强制转换为 Long



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

我想使用以下函数获取我的节点 id 的值:

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中同时检索值?

看看 BigInteger 的 Java 文档:

public long longValue()

将此 BigInteger 转换为 long。这种转换类似于 Java™ 语言规范第 5.1.3 节中定义的从 long 到 int 的缩小基元转换:如果此 BigInteger 太大而无法容纳长整型,则仅返回低阶 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的性能要差得多,因此仅当性能不是问题或绝对确定值会太大以至于绝对必要时才使用它。

最新更新