2016-07-11 22 views
0

auszuführen Ich versuche, eine Funktion mit Slick3 zu implementieren ein Tupel zurück.Wie dynamische Abfrage mit SQL "" wählt c von T ""“. Als [T] Interpolation in slick

def executeQueryConfig2[T](sql: String, f : Option[T] => Unit): Future[T] = { 
val action2 = sql"""$sql""".as[T].headOption 
getDatabase(config).run(action2).mapTo[T].map(f(_)).recover{ case e: SQLException => println(e.getMessage) } 
....... 
} 

Der Compiler den Fehler zeigt:

Error:(66, 35) could not find implicit value for parameter rconv: slick.jdbc.GetResult[T] 
val action2 = sql"""$sql""".as[T].headOption 
          ^

Wenn T die Art in Typen ist, die durch die Slick-3 umgesetzt wurden, wie ich eine solche Funktion implementieren

Beispiel:

Vielen Dank.

+0

Siehe Dokumentation (http://slick.lightbend.com/doc/3.1.0/sql.html#result-sets): 'implizite val getMyResult = GetResult (r => MyCaseClass (r <<. , ...)) ' – devkat

+0

Sicher. Ich habe das Dokument gelesen, das du erwähnt hast. Aber ich weiß nicht genau, wie es geht. Würdest du mir bitte einen Beispielcode zeigen? – Birdflying1005

+0

Dies ist für den Typparameter T nicht möglich; es muss für den/die von Ihnen verwendeten Typen durchgeführt werden. Was meinst du mit "Wenn T der Typ in Typen ist, die von der Slick 3 implementiert wurden"? – devkat

Antwort

0

Sie haben die GetResult Funktion für Ihre Art T bieten:

def executeQueryConfig2[T:ClassTag](sql: String, f: Option[T] => Unit) 
    (implicit rconv: GetResult[T]): Future[T] = { 
    val action2 = sql"""$sql""".as[T].headOption 

By the way, die folgende Anweisung nicht kompiliert, da Sie nicht f auf T aufrufen kann, nur auf Option[T].

db.run(action2).mapTo[T].map(f(_)).recover{ case e: SQLException => println(e.getMessage) } 
}