这个例外以非常奇怪的方式出现。
我正在从类型为 DECIMAL(15,4)的存储过程中读取变量的值。 在java结束时,我将这个值类型转换为 BigDecimal ,它工作得非常好。 现在我开始得到这个异常: java.lang.ClassCastException:java.lang.Double与java.math.BigDecimal 不兼容并解决这个问题我将此变量类型转换为 Double 然后使用
将其强制转换回 BigDecimal新:
Double myVarDb= //reading some variable's value with type-> DECIMAL(15,4) from Db end
BigDecimal myVar = (BigDecimal)BigDecimal.valueOf(myVarDb);
旧:
BigDecimal myVar= //reading some variable's value with type-> DECIMAL(15,4)
如果有人遇到过这个问题或者想知道为什么会这样,请指导。
更新:我检查了两个驱动程序,以下是版本:
Old:DriverVersion:3.6.60
新:DriverVersion:3.64.106
我在读取值后创建的实例的类型为:
旧:BigDecimal
新:双重
所以现在问题很明显,为什么我们得到这个异常,因为我们现在将Double对象作为默认对象。
那么有人可以说明为什么要创建这些不同类型的实例吗? 这是因为不同版本的JDBC驱动程序吗?
答案 0 :(得分:1)
为什么你会得到Double的值然后尝试将它转换为bigDecimal,这是错误的。没有必要让它更难,更复杂。
在Java和JDBC中,所有DECIMAL值都使用BigDecimal进行映射,并且ResultSet的getBigDecimel()
方法允许您直接将其设置为BigDecimal。
您只需使用以下代码行:
BigDecimal myVar = resultSet.getBigDecimal(0);
而不是所有这些(非常糟糕):
Double myVarDb= resultSet.getDouble(0);
BigDecimal myVar = (BigDecimal)BigDecimal.valueOf(myVarDb);
您可以从 Mapping SQL and Java Types 中看到:
DECIMAL和NUMERIC类型的推荐Java映射是java.math.BigDecimal,这是一种Java类型,它也表示具有绝对精度的定点数。 java.math.BigDecimal类型提供数学运算,允许使用其他BigDecimal类型,整数类型和浮点类型添加,减去,乘以和除以BigDecimal类型。
建议用于检索DECIMAL和NUMERIC值的方法是 ResultSet.getBigDecimal。 JDBC还允许访问这些SQL类型 简单的字符串或char数组。因此,Java程序员可以使用 getString接收DECIMAL或NUMERIC结果。但是,这样做 DECIMAL或NUMERIC用于货币值的常见情况 相当尴尬,因为这意味着应用程序编写者必须这样做 对字符串执行数学运算也可以检索这些SQL 类型为任何Java数字类型。
注意:强>
在您的旧代码中,您获得强制转换异常的原因可能是因为您没有使用 .getBigDecimal()方法。