使用NULL列读取行会导致浮动异常

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用NULL列读取行会导致浮动异常相关的知识,希望对你有一定的参考价值。

我有一个列类型日期的表。此列接受空值,因此,我将其声明为选项(请参阅下面的字段perDate)。当我通过应用程序代码运行select查询时,我得到以下异常

slick.SlickException:读取ResultSet列的NULL值(null)

问题。这是Slick表定义:

  import java.sql.Date
  import java.time.LocalDate

  class FormulaDB(tag: Tag) extends Table[Formula](tag, "formulas") {

    def sk = column[Int]("sk", O.PrimaryKey, O.AutoInc)
    def formula = column[Option[String]]("formula")
    def notes = column[Option[String]]("notes")
    def periodicity = column[Int]("periodicity")
    def perDate = column[Option[LocalDate]]("per_date")(localDateColumnType)

    def * =
    (sk, name, descrip, formula, notes, periodicity, perDate) <>
    ((Formula.apply _).tupled, Formula.unapply)

    implicit val localDateColumnType = MappedColumnType.base[Option[LocalDate], Date](
    {
       case Some(localDate) => Date.valueOf(localDate)
       case None => null
    }, { sqlDate =>
       if (sqlDate != null) Some(sqlDate.toLocalDate) else None
   }
  )

}
答案

您映射的列函数只需要提供LocalDateDate的转换。如果它知道如何处理Option[LocalDate],Slick会自动处理LocalDate

这意味着将你的localDateColumnType改为:

implicit val localDateColumnType = MappedColumnType.base[LocalDate, Date](
  Date.valueOf(_), _.toLocalDate
)

Essential Slick的第5章涵盖了其中的一部分,User Defined Features in the Manual部分也是如此。

我不是100%肯定你为什么会看到运行时错误:我的猜测是该列被视为Option[Option[LocalDate]]或类似的,并且那里有一个被忽略的空值。

顺便说一下,你的def *可能是:

def * = (sk, name, descrip, formula, notes, periodicity, perDate).mapTo[Formula]

...这是一个更好看的。 mapTo在某些时候被添加到Slick 3中。

以上是关于使用NULL列读取行会导致浮动异常的主要内容,如果未能解决你的问题,请参考以下文章

从 .csv 文件中删除一些行会导致向其中添加 NaN 列

Android 蓝牙 LE - 读取浮动特性

Android getSupportFragmentManager Fragment中的NULL指针异常

片段中的getView()导致抛出异常,不确定原因

片段中的TextView在Android Studio中返回Null

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例