ka4*_*eli 6 types scala type-inference slick
有这样的模型(简化):
case class User(id:Int,name:String)
case class Address(id:Int,name:String)
...
Run Code Online (Sandbox Code Playgroud)
Slick(2.1.0版)表映射:
class Users(_tableTag: Tag) extends Table[User](_tableTag, "users") with WithId[Users, User] {`
val id: Column[Int] = column[Int]("id", O.AutoInc, O.PrimaryKey)
...
}
trait WithId[T, R] {
this: Table[R] =>
def id: Column[Int]
}
Run Code Online (Sandbox Code Playgroud)
混合特性WithId我想用列实现不同表的通用DAO方法id: Column[Int] (我希望方法findById与两者User和Address表映射一起使用)
trait GenericSlickDAO[T <: WithId[T, R], R] {
def db: Database
def findById(id: Int)(implicit stk: SlickTableQuery[T]): Option[R] = db.withSession { implicit session =>
stk.tableQuery.filter(_.id === id).list.headOption
}
trait SlickTableQuery[T] {
def tableQuery: TableQuery[T]
}
object SlickTableQuery {
implicit val usersQ = new SlickTableQuery[Users] {
val tableQuery: Table Query[Users] = Users
}
}
Run Code Online (Sandbox Code Playgroud)
问题是findById不编译:
错误:(13,45)类型不匹配; found:需要选项[T#TableElementType]:Option [R] stk.tableQuery.filter(_.id === id).list.headOption
我认为它T是类型的WithId[T, R],同时也是类型Table[R].Slick实现了Table这样的类型,如果那样的X=Table[Y]话X#TableElementType=Y.
所以在我的情况下T#TableElementType=R,Option[T#TableElementType]应该推断,Option[R]但事实并非如此.我哪里错了?
| 归档时间: |
|
| 查看次数: |
2499 次 |
| 最近记录: |