Scala在从查询结果中读取null bigdecimal时引发异常



我有一个方法,其主体如下:

try {
val query = "SELECT decimalValue as decimal_value FROM table";
val con = new DbConnection
val statement = con.preparedStatement(query)
val rset = statement.executeQuery()
var myDecimalValue = 0
if (rset.next()) {
myDecimalValue = rset.getBigDecimal("decimal_value")
}
}
catch {
case e: Exception => println(e.getMessage)
}

如果查询结果为空,我会得到一个异常:null value for BigDecimal

但是,从ResultSet.javagetBigDecimal方法中,我发现了这个定义:

* @return the column value (full precision);
* if the value is SQL <code>NULL</code>, the value returned is
* <code>null</code> in the Java programming language.

如何避免这种情况?我真的需要像下面这样将我的参数声明为Option,如果我知道结果可以包含null值?!:

var myDecimalValue: Option[BigDecimal] = Option(BigDecimal(0))

内部如果:

val rsetValue = rset.getBigDecimal("decimal_value")
if (rsetValue != null) myDecimalValue = Option(rsetValue)

更新:stracktrace

java.lang.IllegalArgumentException: null value for BigDecimal
at scala.math.BigDecimal.<init>(BigDecimal.scala:405)
at scala.math.BigDecimal$.apply(BigDecimal.scala:333)
at scala.math.BigDecimal$.apply(BigDecimal.scala:330)
at scala.math.BigDecimal$.javaBigDecimal2bigDecimal(BigDecimal.scala:345)
at ...
at ...
at ...
at java.lang.Thread.run(Thread.java:748)

您真的不希望null泄漏到Scala代码中。当与可以返回null的Java代码接口时,最好的方法是将结果封装到Option(x)中。这将负责将null转换为None

还要避免var,更喜欢val

因此,对你的程序的即时修复将是

val myDecimalValue = if (rs.next) Option(rs.getBigDecimal("decimal_value")) else None

但除此之外,我还要做的是找到一个合理的数据库访问库。Slick或Doobie等完整的Scala解决方案对初学者来说可能有点挑战,但原始JDBC太痛苦了。也许是Apache DbUtils之类的东西?任何人都不需要手动迭代结果集并将列拉出到变量中。您应该从该库中获取模型类的列表。

相关内容

  • 没有找到相关文章

最新更新