使用Slick 2.0的通用CRUD操作

时间:2014-03-11 22:28:33

标签: scala crud slick slick-2.0

我正在尝试为Slick 2.0编写一个通用的CRUD特性。该特征应 a)提供从数据库中读取/更新/删除实体以及 b)摘要的通用方法。在this slick example(数据库抽象)和this article(CRUD特征)之后,我提出了以下(缩短的)代码片段:

trait Profile {
  val profile: JdbcProfile
}

trait Crud[T <: AbstractTable[A], A] { this: Profile =>
  import profile.simple._

  val qry: TableQuery[T]

  def countAll()(implicit session: Session): Int = {
    qry.length.run
  }

  def getAll()(implicit session: Session): List[A] = {
      qry.list // <-- type mismatch; found: List[T#TableElementType] required: List[A]
  }
}

由于类型不匹配,代码无效。第二个函数的返回类型似乎是List[T#TableElementType]类型,但需要是List [A]。关于如何解决问题的任何想法。另外还可以参考有关通用Slick 2.0操作的进一步阅读。

1 个答案:

答案 0 :(得分:2)

type TableElementTypeclass AbstractTable[A]内是抽象的。 Scala不了解ATableElementType之间的任何关系。另一方面,class Table定义final type TableElementType = A,它告诉Scala关于这种关系(显然Scala足够聪明,可以使用final注释来知道关系甚至适用于子类型{{ 1}} eventhough T <: Table[A]Table[A]}中不是共变体。

因此,您需要使用A代替T <: Table[A]。而且因为T <: AbstractTable[A]位于光滑的驱动蛋糕内(如蛋糕模式),你需要将你的Crud移动到你的蛋糕中。蛋糕是病毒。

Table