2016-12-13 1 views
2

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

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) 

Répondre

3

Pour autant que je vous vois simplement que vous manquez d'importation API profil dans UserService.

Ajoutez simplement cette importation: import profile.api._ et cela devrait fonctionner.

EDIT: BTW Je vois beaucoup de gens construire leur propre version de base CRUDs pour Slick. Avez-vous essayé certaines bibliothèques minces existantes, par exemple? ici: https://github.com/VirtusLab/unicorn? Ce n'est pas vraiment lié à cette question, mais cela peut valoir la peine d'y jeter un coup d'œil.

+0

@ (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. –