我遇到了一种奇怪的行为,我需要一些帮助来弄清楚为什么会发生这种情况。问题是我有一个查询如下:
db.withSession { implicit session =>
tables.users.where(_.id === UserId(1)).firstOption
}
这不会编译产生如下错误:
inferred type arguments [Boolean] do not conform to method where's type parameter bounds [T <: scala.slick.lifted.Column[_]]
但是,如果我将代码重写为:
db.withSession { implicit session =>
(for {
u <- tables.users if u.id === UserId(1)
} yield u).firstOption
}
它编译并且工作正常。
该表定义如下:
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[UserId]("id", O.PrimaryKey, O.AutoInc, O.NotNull)
}
我有一个隐式转换来映射 UserId 类型:
implicit lazy val userIdColumnType = MappedColumnType.base[UserId, Int](_.value, UserId(_))
它看起来像一个类型推断问题,但我无法真正理解它为什么会发生。
任何人都知道为什么在我报告的两种情况下这应该表现不同?
编辑:经过一番调查,我发现当使用where
隐式转换时userIdColumnType
,必须在范围内,而使用 for 理解则不需要。对此有很好的解释吗?