我正在与Slick的提升嵌入和映射表挣扎。 API对我来说感觉很陌生,也许只是因为它的结构是我不熟悉的。如何将Slick的映射表与外键一起使用?
我想构建一个任务/待办事项列表。有两个实体:
- 任务:每个任务都有一个对下一个任务的可选引用。这样就构建了一个链表。目的是用户可以按他的优先顺序排列任务。该顺序由任务对任务的引用表示。
TaskList:表示带有标签和对列表的第一个任务的引用的TaskList。
case class Task(id: Option[Long], title: String, nextTask: Option[Task])
case class TaskList(label: String, firstTask: Option[Task])
现在我试着写一个数据访问对象(DAO),这两个实体。
import scala.slick.driver.H2Driver.simple._
import slick.lifted.MappedTypeMapper
implicit val session: Session = Database.threadLocalSession
val queryById = Tasks.createFinderBy(t => t.id)
def task(id: Long): Option[Task] = queryById(id).firstOption
private object Tasks extends Table[Task]("TASKS") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def title = column[String]("TITLE")
def nextTaskId = column[Option[Long]]("NEXT_TASK_ID")
def nextTask = foreignKey("NEXT_TASK_FK", nextTaskId, Tasks)(_.id)
def * = id ~ title ~ nextTask <> (Task, Task.unapply _)
}
private object TaskLists extends Table[TaskList]("TASKLISTS") {
def label = column[String]("LABEL", O.PrimaryKey)
def firstTaskId = column[Option[Long]]("FIRST_TASK_ID")
def firstTask = foreignKey("FIRST_TASK_FK", firstTaskId, Tasks)(_.id)
def * = label ~ firstTask <> (Task, Task.unapply _)
}
不幸的是,它不能编译。这两个表的*
投影分别在nextTask
各自的firstTask
。
could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[scala.slick.lifted.ForeignKeyQuery[SlickTaskRepository.this.Tasks.type,justf0rfun.bookmark.model.Task]]
could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[scala.slick.lifted.ForeignKeyQuery[SlickTaskRepository.this.Tasks.type,justf0rfun.bookmark.model.Task]]
我试图解决与以下TypeMapper但是,这并不编译,太。
implicit val taskMapper = MappedTypeMapper.base[Option[Long], Option[Task]](
option => option match {
case Some(id) => task(id)
case _ => None
},
option => option match {
case Some(task) => task.id
case _ => None
})
could not find implicit value for parameter tm: scala.slick.lifted.TypeMapper[Option[justf0rfun.bookmark.model.Task]]
not enough arguments for method base: (implicit tm: scala.slick.lifted.TypeMapper[Option[justf0rfun.bookmark.model.Task]])scala.slick.lifted.BaseTypeMapper[Option[Long]]. Unspecified value parameter tm.
主要问题:如何用油滑的解除嵌入和映射表的正确方法?如何让这个工作?
在此先感谢。
嗨cvogt,这个限制仍然适用于Slick 2.0吗?你有没有参考这种情况应该如何排序?谢谢! –
嗨。你有没有发表你的文章? – n1r3
不,但它仍然在我的名单上,可能会在夏天之前发生一段时间。我会在Slick邮件列表上公布它。 – cvogt