Slick 3.1.1 涉及过滤器和隐式 CanBeQueryCondition 的模糊隐式值
Slick 3.1.1 ambiguous implicit values involving filter and implicit CanBeQueryCondition
我一直在尝试在 Slick 3.1.1 上创建一个通用 Dao,它包含一个与 JPA 竞争的通用过滤器 findByExample
,请参阅以下文件:
- GenericDaoImpl.scala 可在所有模型中重复使用的通用关卡
- UserDao.scala 用户模型的通用和定制
- UserService.scala 将 UserDao 包装成更多服务级别的功能
在最后一个文件中,我尝试使用通用过滤器功能通过注册电子邮件查找用户,如下所示:
// this will implicitly exec and wait indefinitely for the
// db.run Future to complete
import dao.ExecHelper._
def findByEmail(email: String): Option[UserRow] = {
userDao.filter(_.email === email).headOption
}
但这会产生编译器错误:
[error] /home/bravegag/code/play-authenticate-usage-scala/app/services/UserService.scala:35: value === is not a member of String
[error] userDao.filter(email === _.email).headOption
[error] ^
[error] /home/bravegag/code/play-authenticate-usage-scala/app/services/UserService.scala:35: ambiguous implicit values:
[error] both value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[slick.lifted.Rep[Option[Boolean]]]
[error] and value BooleanCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[Boolean]
[error] match expected type slick.lifted.CanBeQueryCondition[Nothing]
[error] userDao.filter(email === _.email).headOption
[error] ^
任何人都可以建议如何改进下面的 filter
函数的隐式声明以解决此编译器错误?
过滤函数的实现(在GenericDaoImpl.scala中找到)是:
// T is defined above as T <: Table[E] with IdentifyableTable[PK]
override def filter[C <: Rep[_]](expr: T => C)
(implicit wt: CanBeQueryCondition[C]) : Future[Seq[E]] =
db.run(tableQuery.filter(expr).result)
据我所知,您只是缺少 API 在 UserService
中导入的个人资料。
只需在此处添加此导入:import profile.api._
它应该可以工作。
编辑:顺便说一句,我看到很多人为 Slick 构建他们自己的基本 CRUD 版本。您是否尝试过一些现有的精简库来做到这一点,例如这里:https://github.com/VirtusLab/unicorn?它与这个问题并没有真正的关系,但可能值得一看。
我一直在尝试在 Slick 3.1.1 上创建一个通用 Dao,它包含一个与 JPA 竞争的通用过滤器 findByExample
,请参阅以下文件:
- GenericDaoImpl.scala 可在所有模型中重复使用的通用关卡
- UserDao.scala 用户模型的通用和定制
- UserService.scala 将 UserDao 包装成更多服务级别的功能
在最后一个文件中,我尝试使用通用过滤器功能通过注册电子邮件查找用户,如下所示:
// this will implicitly exec and wait indefinitely for the
// db.run Future to complete
import dao.ExecHelper._
def findByEmail(email: String): Option[UserRow] = {
userDao.filter(_.email === email).headOption
}
但这会产生编译器错误:
[error] /home/bravegag/code/play-authenticate-usage-scala/app/services/UserService.scala:35: value === is not a member of String
[error] userDao.filter(email === _.email).headOption
[error] ^
[error] /home/bravegag/code/play-authenticate-usage-scala/app/services/UserService.scala:35: ambiguous implicit values:
[error] both value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[slick.lifted.Rep[Option[Boolean]]]
[error] and value BooleanCanBeQueryCondition in object CanBeQueryCondition of type => slick.lifted.CanBeQueryCondition[Boolean]
[error] match expected type slick.lifted.CanBeQueryCondition[Nothing]
[error] userDao.filter(email === _.email).headOption
[error] ^
任何人都可以建议如何改进下面的 filter
函数的隐式声明以解决此编译器错误?
过滤函数的实现(在GenericDaoImpl.scala中找到)是:
// T is defined above as T <: Table[E] with IdentifyableTable[PK]
override def filter[C <: Rep[_]](expr: T => C)
(implicit wt: CanBeQueryCondition[C]) : Future[Seq[E]] =
db.run(tableQuery.filter(expr).result)
据我所知,您只是缺少 API 在 UserService
中导入的个人资料。
只需在此处添加此导入:import profile.api._
它应该可以工作。
编辑:顺便说一句,我看到很多人为 Slick 构建他们自己的基本 CRUD 版本。您是否尝试过一些现有的精简库来做到这一点,例如这里:https://github.com/VirtusLab/unicorn?它与这个问题并没有真正的关系,但可能值得一看。