2016-04-23 12 views
1

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)) 
+0

Ich verstehe Ihre Frage nicht vollständig, aber vielleicht hilft Ihnen dieses Tutorial: http://pedrorijo.com/blog/play-slick/ – pedrorijo91

+0

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

+0

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

Antwort

0

Problem gelöst.

hatte ich

import slick.driver.MySQLDriver.api._ 

statt

import slick.driver.MySQLDriver.api.DBIO 
import slick.driver.MySQLDriver.api.Database 
import slick.driver.MySQLDriver.api.columnExtensionMethods 
import slick.driver.MySQLDriver.api.longColumnType 
import slick.driver.MySQLDriver.api.streamableQueryActionExtensionMethods 
import slick.driver.MySQLDriver.api.valueToConstColumn 

Während ich mit verschiedenen Abfragen Eclipse (oder ich?) Spielte, verwenden, um beendet Zugabe der oben Import-Anweisungen meiner Klasse, wo ich führte die Auswahl durch.

Wie Sie in meiner Frage sehen können, bekam ich immer den gleichen Fehler (siehe Eclipse error mark), sobald ich "map" verwenden wollte, auch während andere Abfragen funktionierten.

Jedoch. Das Ersetzen dieser Importanweisungen durch einfach import slick.driver.MySQLDriver.api._ löste mein Problem. Ich weiß noch nicht warum, aber es funktioniert jetzt, wie wir alle erwartet haben. Wenn Sie wissen, was mit den von mir/eclipse hinzugefügten Importen falsch läuft, kommentieren Sie bitte.

0

Wenn Sie dieses Beispiel zu verwenden: https://github.com/pedrorijo91/play-slick3-steps/blob/master/app/models/User.scala

Anstelle von:

def get(id: Long): Future[Option[User]] = { 
    dbConfig.db.run(users.filter(_.id === id).result.headOption) 
    } 

Sie nur E-Mail-Feld

mit auswählen können
def getField(id: Long): Future[Option[String]] = { 
    dbConfig.db.run(users.filter(_.id === id).map(_.email).result.headOption) 
    } 
+0

stimme ich zu Und ich konnte zB eine solche Abfrage in Hallo-Slick-3 schreiben.0 Beispiel von typesafe (https://github.com/typesafehub/activator-hello-slick#slick-3.0) aber mit meiner generierten Lied-Tabelle habe ich immer noch den gleichen Fehler: Keine passende Form gefunden. Ich weiß nur nicht, was der Unterschied zu meinem Code ist ... – Philipp

Verwandte Themen