Je suis en train de créer un Dao générique sur Slick 3.1.1 et comprend un filtre générique qui est en concurrence avec JPA de findByExample
, consultez les fichiers suivants:Slick 3.1.1 valeurs implicites ambiguës impliquant le filtre et CanBeQueryCondition implicite
- GenericDaoImpl.scala réutilisable niveau générique pour tous les modèles
- UserDao.scala personnalisations, plus génériques pour le modèle utilisateur
- UserService.scala Wraps la UserDao en fonctionnalité de niveau plus de services
Dans ce dernier fichier je tente d'utiliser la fonction de filtre générique pour trouver un utilisateur par son e-mail enregistrée, comme ceci:
// 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
}
mais cela produit l'erreur du compilateur:
[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] ^
Can Quelqu'un de conseils sur la façon dont la déclaration implicite de la fonction filter
ci-dessous peut être améliorée pour résoudre cette erreur de compilation?
La mise en œuvre de la fonction de filtre (dans GenericDaoImpl.scala) est:
// 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)
@ (Pawel Dolega) point équitable. Tout d'abord, si je cherche un dao générique pour Slick, même Google avec tous ses Machine Learning ne correspondra à un projet appelé Unicorn. Je suis tout à fait pour "ne pas réinventer la roue" mais il ya beaucoup de roues cassées autour ou pas assez rapide pour suivre le rythme du changement qui se passe dans Slick et en général toute la pile Scala. –