/ / So geben Sie eine Liste [User] zurück, wenn Sie sql mit slick - scala, playframework, slick verwenden

Wie man eine Liste [Benutzer] zurückgibt, wenn Sie sql mit slick - scala, playframework, slick verwenden

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 № 1

Wie @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.