Haben solche Modelle (vereinfacht):Scala Typinferenz mit Slick Tabelle arbeiten
case class User(id:Int,name:String)
case class Address(id:Int,name:String)
...
Slick (2.1.0 Version) Tabellenzuordnung:
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]
}
Merkmal Misch WithId
ich generische DAO implementieren möchten Methoden für verschiedene Tabellen mit Spalte id: Column[Int]
(ich möchte, dass die Methode findById
sowohl mit User
als auch Address
Tabellenzuordnungen funktioniert)
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
}
}
Das Problem ist, dass findById
nicht nicht kompiliert:
Error:(13, 45) type mismatch; found : Option[T#TableElementType] required: Option[R] stk.tableQuery.filter(_.id === id).list.headOption
Wie ich es sehe T
vom Typ WithId[T, R]
und zugleich vom Typ Table[R]
. Slick implementiert den Typ Table
so, dass wenn X=Table[Y]
dann X#TableElementType=Y
.
Also in meinem Fall T#TableElementType=R
und Option[T#TableElementType]
sollte als Option[R]
abgeleitet werden, aber es ist nicht. Wo liege ich falsch?
Vielen Dank für diese Lösung! – ka4eli