我有一个列类型为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
}
)
}
1条答案
按热度按时间ht4b089n1#
Map列函数只需要提供
LocalDate
至Date
转换。slick会自动处理Option[LocalDate]
如果它知道如何处理LocalDate
.那就意味着改变你的想法
localDateColumnType
成为:essential slick的第5章介绍了其中的一些内容,手册中关于用户定义特性的部分也介绍了这些内容。
我不能100%确定您为什么会看到运行时错误:我的猜测是该列被视为
Option[Option[LocalDate]]
或者类似的,其中有一个空值级别被忽略了。顺便说一句,你的
def *
可能是:…读起来更好看一点。这个
mapTo
在slick 3的某个地方被添加了。