Ich möchte einfach eine Abfrage schreiben, die nur eine Spalte (wählen Sie den Titel aus ...) für jede resultierende Zeile statt alle (wählen Sie * ... aus). My SQL-Abfrage wäre:Slick: Wählen Sie die Spalten nicht funktioniert
select titel from Lied;
http://slick.typesafe.com/doc/3.1.1/sql-to-slick.html?highlight=case#id3 Nach soll ich von der Lage nur ein paar Spalten auswählen, indem Sie einfach so etwas wie dies in slick 3.1 tun:
people.map(p => (p.age, p.name ++ " (" ++ p.id.asColumnOf[String] ++ ")")).result
Für mich bedeuten würde, :
lieds.map(x => (x.titel)).result.map { println }
Dies funktioniert nicht. Eclipse sagt:
No matching Shape found. Slick does not know how to map the given types. Possible causes: T in Table[T] does not match your * projection. Or you use an unsupported type in a Query (e.g. scala List). Required level: slick.lifted.FlatShapeLevel Source type: slick.lifted.Rep[String] Unpacked type: T Packed type: G
Wie soll ich das lösen? Ich schätze, ich kann noch einige Grundlagen hier nicht kombinieren, obwohl ich scala slick method I can not understand so far (nicht sicher, ob das immer noch für Slick 3.1 gültig ist) und die Slick 3.1 Dokumentation lesen.
My Table (von Slick generiert):
case class LiedRow(id: Long, titel: String, rubrikId: Option[Long] = None, stichwoerter: Option[String] = None, bemerkungen: Option[String] = None, createdAt: Option[java.sql.Timestamp] = None, updatedAt: Option[java.sql.Timestamp] = None, externallink: Option[String] = None, lastedituserId: Long, tonality: Option[String] = None)
implicit def GetResultLiedRow(implicit e0: GR[Long], e1: GR[String], e2: GR[Option[Long]], e3: GR[Option[String]], e4: GR[Option[java.sql.Timestamp]]): GR[LiedRow] = GR{
prs => import prs._
LiedRow.tupled((<<[Long], <<[String], <<?[Long], <<?[String], <<?[String], <<?[java.sql.Timestamp], <<?[java.sql.Timestamp], <<?[String], <<[Long], <<?[String]))
}
class Lied(_tableTag: Tag) extends Table[LiedRow](_tableTag, "lied") {
def * = (id, titel, rubrikId, stichwoerter, bemerkungen, createdAt, updatedAt, externallink, lastedituserId, tonality) <> (LiedRow.tupled, LiedRow.unapply)
def ? = (Rep.Some(id), Rep.Some(titel), rubrikId, stichwoerter, bemerkungen, createdAt, updatedAt, externallink, Rep.Some(lastedituserId), tonality).shaped.<>({r=>import r._; _1.map(_=> LiedRow.tupled((_1.get, _2.get, _3, _4, _5, _6, _7, _8, _9.get, _10)))}, (_:Any) => throw new Exception("Inserting into ? projection not supported."))
val id: Rep[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
val titel: Rep[String] = column[String]("Titel")
val rubrikId: Rep[Option[Long]] = column[Option[Long]]("rubrik_id", O.Default(None))
val stichwoerter: Rep[Option[String]] = column[Option[String]]("Stichwoerter", O.Default(None))
val bemerkungen: Rep[Option[String]] = column[Option[String]]("Bemerkungen", O.Default(None))
val createdAt: Rep[Option[java.sql.Timestamp]] = column[Option[java.sql.Timestamp]]("created_at", O.Default(None))
val updatedAt: Rep[Option[java.sql.Timestamp]] = column[Option[java.sql.Timestamp]]("updated_at", O.Default(None))
val externallink: Rep[Option[String]] = column[Option[String]]("externalLink", O.Default(None))
val lastedituserId: Rep[Long] = column[Long]("lastEditUser_id")
val tonality: Rep[Option[String]] = column[Option[String]]("tonality", O.Length(30,varying=true), O.Default(None))
lazy val rubrikFk = foreignKey("liedRubrik", rubrikId, Rubrik)(r => Rep.Some(r.id), onUpdate=ForeignKeyAction.Cascade, onDelete=ForeignKeyAction.NoAction)
lazy val userFk = foreignKey("liedLastEditUser", lastedituserId, User)(r => r.id, onUpdate=ForeignKeyAction.Cascade, onDelete=ForeignKeyAction.NoAction)
}
lazy val Lied = new TableQuery(tag => new Lied(tag))
Ich verstehe Ihre Frage nicht vollständig, aber vielleicht hilft Ihnen dieses Tutorial: http://pedrorijo.com/blog/play-slick/ – pedrorijo91
Vielen Dank für Ihren Link. Das habe ich schon gesehen. Leider kann ich dort nichts finden, was meine Frage beantworten würde. Wie kann ich meine Frage klären? In einem Satz möchte ich eine glatte Aussage, die nur eine Spalte (Titel) statt aller (*) auswählt, weil ich die Werte von den anderen Spalten in dieser speziellen Frage nicht benötige. – Philipp
Es sollte so einfach sein wie 'def getTitelById (id: Long) = lied.filter (_. Id === id) .map (_. Titel)' Dann können Sie 'db.run (getTitelById (1032L) 'um eine Zukunft zu bekommen [String] – Qingwei