2
我一直在嘗試過油滑3.1.1創建一個通用的DAO,它包括一般的過濾器,與JPA的findByExample
競爭隱含CanBeQueryCondition隱含值,請參閱下列文件:油滑3.1.1曖昧涉及過濾器和
-
所有型號
- 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)
@(帕維爾多勒加)公平點。首先,如果我尋找Slick的Generic dao,Google的所有機器學習都不會匹配一個名爲Unicorn的項目。我全力以赴「不重新發明方向盤」,但周圍有許多破碎的輪子,或者速度不夠快,無法跟上Slick和整個Scala堆棧發生的變化速度。 –