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

时间:2018-06-18 14:51:45

标签: mysql exception slick

我有一个包含列类型日期的表。此列接受空值, 因此,我宣布它为一个选项(参见下面的字段perDate)。当我 通过应用程序代码运行select查询我得到以下异常

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

problem.This 是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
   }
  )

}

1 个答案:

答案 0 :(得分:0)

您的映射列函数只需要提供LocalDateDate的转换。如果Slick知道如何处理Option[LocalDate],它将自动处理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]]或类似名称,并且其中存在一个null级别错过了。

顺便说一句,您的def *可能是:

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

...读起来更好一点。 mapTo是在Slick 3中添加的。