Ich kann scheinen zu bekommen, wie ich eine Liste [Benutzer] von einer rohen SQL-Abfrage zurückgeben kann.
implicit val getUserResult = GetResult(r => User(r.nextInt, ....))
sql"""
select * from users where id =1
""".as[User]
Dies scheint in Ordnung zu sein, aber wenn ich dies ändere, um eine Liste und kein einziges Ergebnis zurückzugeben, erhalte ich eine Fehlermeldung.
.as[List[User]]
Error:
could not find implicit value for parameter rconv: scala.slick.jdbc.GetResult[List[User]]
Wie kann ich das implizite GetResult ändern, um eine Liste zurückzugeben?
Aktualisieren
Also habe ich das implizite wie folgt erstellt:
impliziter Wert getUserResult = GetResult (r => User (r.nextInt, ....))
val query: StaticQuery0 [User] = sql "....."
query.list ()
Ich kann diesen Fehler:
[PSQLException: Bad value for type int : asdf asdfs]
In psql kann ich sehen, dass ich "asdf asdfs" in einigen Spalten, aber nicht in INT-Spalten habe. Wenn Dinge kompiliert werden, bin ich mir nicht sicher, warum ich diesen Fehler erhalte. Sieht aus wie ein Bug?
Antworten:
4 für die Antwort № 1Wie @goral sagte, werden Sie wahrscheinlich nur eine Zeile erhalten, da Sie nach der ID filtern. Dennoch können Sie leicht eine Liste erhalten:
import scala.slick.driver.JdbcDriver.backend.Database
import Database.dynamicSession
import scala.slick.jdbc.{GetResult, StaticQuery => Q}
import Q.interpolation
val t: StaticQuery0[User] =
sql"select * from users where id = 1".as[User]
val list: List[User] = t.list()
StaticQuery
hat alle gängigen methoden wie list
, first
, firstOption
und so weiter, da sie von der geerbt werden Invoker
Merkmal.
Wenn Sie eine benutzerdefinierte Fallklasse verwenden und a GetResult
:
case class User(id: Int, name: String)
implicit val getUserResult = GetResult(r => User(r.nextInt, r.nextString))
val t: StaticQuery0[User] = sql"select * from adwords_ads where name = ".as[User]
val list: List[User] = t.list()
Bearbeiten:
Es funktioniert auch ohne den impliziten Mapper für mich, da der Slick-Schema-Generator bereits einen für mich generiert hat:
/** GetResult implicit for fetching SalesforceLogRow objects using plain SQL queries */
implicit def GetResultSalesforceLogRow(implicit e0: GR[Long], e1: GR[String], e2: GR[Int], e3: GR[java.sql.Timestamp], e4: GR[Option[java.sql.Timestamp]]): GR[myEntity] = GR {
prs => import prs._
myEntity.tupled((<<[Long], <<[Long], <<[String], <<[Int], <<[java.sql.Timestamp], <<[Long], <<?[java.sql.Timestamp]))
}
Normalerweise habe ich es in einem Schema-Objekt, anscheinend hast du es nicht und Slick weiß nicht, wie man dein einfaches SQL abbildet.