如何使用 Slick 在 Scala 中通过谓词抽象查询
How to abstract a query by predicate in Scala using Slick
我在我的代码中发现了一个重复的模式,我想对其进行抽象,但我似乎无法正确处理。我想抽象的代码是这样的:
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]
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)
}
我在我的代码中发现了一个重复的模式,我想对其进行抽象,但我似乎无法正确处理。我想抽象的代码是这样的:
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]
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)
}