2013-11-14 3 views
5

Ich versuche, eine Abfrage-Vorlage für wie so zu schreiben:Slick - Parameter werden in einer Abfrage Template ignoriert

val byIdentifier = for { 
    (identifier, issuer) <- Parameters[(String, String)] 
    o <- Objects if (o.identifier === identifier) && (o.identifierIssuer === issuer) 
} yield o 

Und es dann wie folgt verwenden:

def findByIdentifier(id: String, issuer: String): Option[Object] = 
    byIdentifier(id, issuer).firstOption 

Objects ist eine Tabelle mit erhobener Einbettung:

case class Object(val identifer: String, val identifierIssuer: String) 

object Objects extends Table[Object]("objects") { 
    def identifier = column[String]("identifier") 
    def identifierIssuer = column[String]("identifier_issuer") 
    ... 
} 

Das Problem, das ich erlebt habe, ist, dass findByIdentifier("asdf", "weqr") eine Abfrage mit einem 0 erzeugtKlausel, die nur false ist:

select ... from "objects" where false 

Was ich in meiner Anfrage Vorlage fehle richtige Abfrage zu haben?

+0

Dies kann oder keinen Unterschied machen kann. Haben Sie versucht, 'is' anstelle von' === 'in den Filterbedingungen zu verwenden? –

Antwort

1

Versuchen Sie, die folgende Syntax:

val byIdentifier = for { 
    (identifier, issuer) <- Parameters[(String, String)] 
    o <- Objects 
    if o.identifier === identifier 
    if o.identifierIssuer === issuer 
} yield o 

ich oft, dass Slick finden kann mit seiner Syntax ein bisschen wackelig, und die aktuelle Dokumentation ist nicht besonders gut.

Sie können auch Ihre findByIdentifier die Arbeit machen:

def findByIdentifier(id: String, issuer: String): Option[Object] = { 
    Query(Object).where(_.identifier === id).where(_.identifierIssuer === issuer).run.headOption 
} 

Ich hoffe, das hilft ...