2016-12-13 83 views
2

我一直在嘗試過油滑3.1.1創建一個通用的DAO,它包括一般的過濾器,與JPA的findByExample競爭隱含CanBeQueryCondition隱含值,請參閱下列文件:油滑3.1.1曖昧涉及過濾器和

在這最後一個文件我嘗試使用通用的過濾功能通過其註冊的電子郵件,以查找用戶,像這樣:

// 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) 

回答

3

至於我可以看到你只是缺少你UserService輪廓API進口。

只需添加此導入:import profile.api._它應該工作。

編輯:順便說一句我看到很多人建立自己的版本的基礎CRUDs爲油滑。您是否嘗試過一些現有的精簡庫,例如這裏:https://github.com/VirtusLab/unicorn?這與這個問題沒有什麼關係,但可能值得一看。

+0

@(帕維爾多勒加)公平點。首先,如果我尋找Slick的Generic dao,Google的所有機器學習都不會匹配一個名爲Unicorn的項目。我全力以赴「不重新發明方向盤」,但周圍有許多破碎的輪子,或者速度不夠快,無法跟上Slick和整個Scala堆棧發生的變化速度。 –