读取包含空列的行会导致slick中出现异常

7y4bm7vi  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(522)

我有一个列类型为date的表。此列接受空值,因此,我将其声明为一个选项(请参见下面的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
   }
  )

}
ht4b089n

ht4b089n1#

Map列函数只需要提供 LocalDateDate 转换。slick会自动处理 Option[LocalDate] 如果它知道如何处理 LocalDate .
那就意味着改变你的想法 localDateColumnType 成为:

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

essential slick的第5章介绍了其中的一些内容,手册中关于用户定义特性的部分也介绍了这些内容。
我不能100%确定您为什么会看到运行时错误:我的猜测是该列被视为 Option[Option[LocalDate]] 或者类似的,其中有一个空值级别被忽略了。
顺便说一句,你的 def * 可能是:

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

…读起来更好看一点。这个 mapTo 在slick 3的某个地方被添加了。

相关问题