Slick 3.1.1 涉及过滤器和隐式 CanBeQueryCondition 的模糊隐式值

Slick 3.1.1 ambiguous implicit values involving filter and implicit CanBeQueryCondition

我一直在尝试在 Slick 3.1.1 上创建一个通用 Dao,它包含一个与 JPA 竞争的通用过滤器 findByExample,请参阅以下文件:

在最后一个文件中,我尝试使用通用过滤器功能通过注册电子邮件查找用户,如下所示:

// 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?它与这个问题并没有真正的关系,但可能值得一看。