Scala исключение исключения для чтения null bigdecimal из результата запроса - PullRequest
0 голосов
/ 14 июля 2020

У меня есть метод с таким телом:

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

но из метода getBigDecimal of ResultSet.java Я нашел это определение:

* @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.

Как этого избежать? Мне действительно нужно объявить мой параметр как вариант, подобный этому (ниже), если я знаю, что результат может содержать нулевые значения?!:

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)

1 Ответ

1 голос
/ 14 июля 2020

Вы действительно не хотите, чтобы null просочился в Scala код. При взаимодействии с кодом Java, который может возвращать null, лучший способ - обернуть результат в Option(x). Это поможет превратить null в None.

Также избегайте var, предпочитайте val.

Таким образом, немедленное исправление вашей программы будет

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

Но что я бы также сделал помимо этого, так это нашел бы разумную библиотеку доступа к базе данных. Полноценные решения Scala, такие как Slick или Doob ie, вероятно, немного сложны для новичков, но необработанный JDB C слишком болезненен. Может что-то вроде Apache DbUtils? Никто не должен вручную перебирать наборы результатов и извлекать столбцы в переменные. Вы должны получить обратно списки классов моделей из этой библиотеки.

...