2016-05-04 7 views
1

I mit Scala 2.10 Slick 2.1.0 verwenden. Ich habe ein Wertobjekt (EMail), die ich in eine Spalte VARCHAR kartieren.Slick wählen Wert-Objekt (ausfahrende AnyVal)

object EMail { 
    import java.util.regex.Pattern 
    val emailRegex = Pattern.compile("^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE) 

    val empty = EMail("[email protected]") 
} 

case class EMail(value: String) extends AnyVal with MappedTo[String] { 
    def isValid: Boolean = EMail.emailRegex.matcher(value).find 

    def validate: EMail = { 
    assert(isValid) 
    EMail(value.trim.toLowerCase) 
    } 

    override def toString = validate.value 
} 

Die Column Definition lautet:

def email = column[Option[EMail]]("email_address") 

Dies ist mein Versuch, einen Sucher zu schreiben:

def findByEmail(email: Option[EMail]): Option[User] = 
    database.withSession { implicit session: Session => 
    queryAll.filter(e => e.email.isDefined && e.email === email).firstOption 
    } 

Dies ist die Fehlermeldung erhalte ich:

[error] Users.scala:52: ambiguous implicit values: [error] both value BooleanCanBeQueryCondition in object CanBeQueryCondition of type => scala.slick.lifted.CanBeQueryCondition[Boolean] [error] and value BooleanOptionColumnCanBeQueryCondition in object CanBeQueryCondition of type => scala.slick.lifted.CanBeQueryCondition[scala.slick.lifted.Column[Option[Boolean]]] [error] match expected type scala.slick.lifted.CanBeQueryCondition[Nothing] [error] queryAll.filter(_.email === email.map(_.value)).firstOption [error] ^

Antwort

1

Sie müssen keine Option[EMail] auf Ihre Methode übergeben, können Sie einfach machen:

def findByEmail(email: EMail): Option[User] = { 
    database.withSession { implicit session => 
    queryAll.filter(_.email === email).firstOption 
    } 
} 

Wenn Sie wirklich eine Option[EMail]] als Eingabeparameter benötigen, sollten Sie folgendes versuchen:

def findByEmail(emailOpt: Option[EMail]): Option[User] = { 
    emailOpt.flatMap { email => 
    database.withSession { implicit session => 
     queryAll.filter(_.email === email).firstOption 
    } 
    } 
} 
+0

I habe entdeckt, dass du richtig bist. https://github.com/mslinn/slick_2.1.0_mappings/blob/master/src/main/scala/App.scala Ich hatte gedacht, diesen Beitrag zu löschen –