java - 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
?
解决方案
只需查看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
性能要低得多,因此只有在性能不是问题或者您绝对确定值会如此之大以至于这是绝对必要的情况下才使用它。
推荐阅读
- java - 我的日志消息在 Android 中仅打印 2 次
- node.js - Node.js“node-cron”未在 Google 应用引擎上运行
- javascript - Angular 8 组件
- r - 配对 t.test 分组因子必须恰好有 2 个级别错误
- mysql - 为什么 - 或何时 - MySQL 不将索引用于 OR 条件,如果它用于 AND 条件?
- node.js - Chrome vs Node - 为什么节点的获取速度比 Chrome 慢?
- javascript - 如何使用 Javascript 更改元素中的一个类
- python - 3D numpy 数组中的两个非零元素是否“连接”?
- javascript - SAPUI5:如何在 HANA 中的两个表之间创建外键链接
- java - jira rest 预计至少有 1 个 bean 有资格作为此依赖项的自动装配候选者