Ald*_*nio 2 scala slick slick-2.0
我正在经历一个奇怪的光滑行为,我想帮助弄清楚它为什么会发生.问题是我的查询内容如下:
db.withSession { implicit session =>
tables.users.where(_.id === UserId(1)).firstOption
}
Run Code Online (Sandbox Code Playgroud)
这不会编译产生错误,如下所示:
inferred type arguments [Boolean] do not conform to method where's type parameter bounds [T <: scala.slick.lifted.Column[_]]
Run Code Online (Sandbox Code Playgroud)
但是,如果我将代码重写为:
db.withSession { implicit session =>
(for {
u <- tables.users if u.id === UserId(1)
} yield u).firstOption
}
Run Code Online (Sandbox Code Playgroud)
它编译并正常工作.
该表定义如下:
class Users(tag: Tag) extends Table[User](tag, "users") {
def id = column[UserId]("id", O.PrimaryKey, O.AutoInc, O.NotNull)
}
Run Code Online (Sandbox Code Playgroud)
我有一个隐式转换来映射UserId类型:
implicit lazy val userIdColumnType = MappedColumnType.base[UserId, Int](_.value, UserId(_))
Run Code Online (Sandbox Code Playgroud)
它看起来像一个类型推断问题,但我不能真正理解它为什么会发生.
任何人都知道为什么在我报告的两个场景中这应该有不同的表现?
编辑:经过一些调查后,我发现当使用where隐式转换时userIdColumnType必须在范围内,而对于for comprehension则不需要.对此有一个很好的解释吗?
您正在使用ScalaTest中的===.它返回一个布尔值.Slick的===返回一个Column[Boolean].方法filter并where防止使用布尔值(至少在最新版本的Slick中),以保护您免受意外使用==或===在您的情况下使用ScalaTest ,它会对基础值进行本地比较,而不是在数据库中进行相等比较,这是你真正想要的.因为理解被贬低withFilter并且有时会产生布尔值,所以不幸的是我们不能不Boolean理解.
要解决此问题,您需要确保===在查询中选择了Slick .也许您可以使用导入订单或范围来影响这一点.或者,如果你运气不好,你就不能和它们不相容.
我不确定userIdColumnType目前是如何在此处进行交互的.
| 归档时间: |
|
| 查看次数: |
1421 次 |
| 最近记录: |