2016-08-24 28 views
1

我在代码中发现重复模式,我想抽象一下它,但是我似乎无法弄清楚它的正确性。我想抽象的代码是这样的:如何使用Slick在Scala中通过谓词抽象查询

def queryByPredicate(p: (OAuthClientTable => Rep[Boolean])): Future[Option[OAuthClient]] = { 
    val query = oAuthClientTableQuery.filter(p) 
    db.run(query.result.headOption) 
} 

我想是这样的:

def queryByPredicate[A, B](p: (A => Rep[Boolean]), t: TableQuery[A]): Future[Option[B]] = { 
    val query = t.filter(p) 
    db.run(query.result.headOption) 
} 

但是编译器,错误如下抱怨:

Error:(132, 25) type mismatch; 
found : slick.profile.SqlAction[Option[A#TableElementType],slick.dbio.NoStream,slick.dbio.Effect.Read] 
required: slick.dbio.DBIOAction[Option[B],slick.dbio.NoStream,Nothing] 
db.run(query.result.headOption) 

而且老实说,我不知道如何创建一个通用的Option[A#TableElementType]

回答

1
def queryByPredicate[A <: Table[B], B](p: (A => Rep[Boolean]), t: TableQuery[A]): Future[Option[B]] = { 
    val query = t.filter(p) 
    db.run(query.result.headOption) 
} 
+0

嗨,这很有趣。我也喜欢抽象。你能不能详细说明这个展示一些更多的代码。我现在试图将它们拉到一起,但是我的类型还没有完全匹配。谢谢。 – dasnervtdoch