【发布时间】:2015-07-24 13:27:57
【问题描述】:
我有一个简单的 MySQL 数据库,在 REG_PERIODS 表中有一行。当我运行此查询时,我会返回该行。
val getRegPeriodAction = regPeriods.sortBy(_.endDate).result.head.map { regPeriod ⇒
Logger.debug(s"regPeriod = ${regPeriod}")
regPeriod
}
但是,当我运行此查询时,我什么也得不到,实际上甚至没有到达调试消息!
val getRegPeriodAction = regPeriods.sortBy(_.endDate).result.headOption.map { regPeriodOption ⇒
Logger.debug(s"regPeriodOption = ${regPeriodOption}")
regPeriodOption match {
case Some(regPeriod) ⇒ regPeriod
}
}
我正在使用 play-slick 1.0.0。我在这里误解了什么吗?使用 headOption 时我应该收到 Some(regPeriod) 吗?
编辑
我尝试在db.run( ... ) 中运行headOption 查询并将结果发送到另一个函数,如下所示:
def handleResult(opt: Option[RegistrationPeriod]) {
Logger.debug(s"received $opt")
}
for {
r <- db.run( regPeriods.sortBy(_.endDate.desc).result.headOption )
_ <- handleResult( r )
} ...
奇怪的是,handleResult 从来没有被调用过!一旦我将代码更改为调用head 而不是headOption,一切都会按预期工作。
【问题讨论】:
-
您的问题已经解决了吗?你确定
result.headOption返回一个非空的Option吗?仅当Option有值时才会调用handleResult()。 -
噢!当然,它会返回
None并且因为 handleResult 处于 for 理解中,所以它没有被调用!在处理结果之前,我需要检查r的值。
标签: slick play-slick