具有Slick的列[T]的通用表定义

时间:2014-10-14 08:00:26

标签: scala generics slick

我们最近对我们的光滑代码进行了一些重构以使其成为通用代码,并且在此过程中我们制作了通用表(abstract classes扩展Table)。但是,当我们尝试使用Column[T]生成如下所示的通用表时会出现问题

注意:以下代码无法编译,这只是试图显示我在做什么

abstract class SomeTable[T :BaseTypedType,C](tag:Tag,name:String)(implicit mappedTypeMapperEvidence:BaseColumnType[T], longEvidence T <:< Long) extends Table[C](tag,name) {
   def someColumn:Column[T]
}

让我们假设我们定义了一些表如下

class MyTable(tag:Tag) extends SomeTable[UserId,TestClass](tag,"my_table") {
   def someColumn = column[UserId]("user_id")
}

我们将UserId定义如下

case class UserId(l:Long) extends AnyVal

现在我们已经有MappedColumnType UserId,即

  implicit val userIdType = MappedColumnType.base[UserId,Long]
     (_.id,UserId)

问题是,您似乎无法使用BaseTypeType(由MappedColumnType.base创建)来推断Column[T]的类型

在上面的例子中,以及我想要做的最终结果(写一个通用查询),我们可能会写这样的东西。

def someGenericQuery[C,T<:SomeTable[T]](c:Query[T,C,Seq]) = {
   c.filter(_.someColumn === 1l)
}

这样的东西可以在浮油吗?不幸的是我不能使用名义输入(即使我的UserId扩展另一个类/特征)因为值类不允许(它们不能扩展或扩展任何东西),所以似乎没有任何方法以通用方式显示值类的内部类型(在本例中为Long)

0 个答案:

没有答案