2016-04-23 29 views
1

すべての(select * ... from)ではなく、結果の行ごとに1つの列(...からのタイトルを選択)のみをフェッチします。私のSQL-クエリは次のようになります。私は単に滑らかな3.1でこのような何かを行うことによって、列の夫婦のみを選択できるようにすることによって必要がありますhttp://slick.typesafe.com/doc/3.1.1/sql-to-slick.html?highlight=case#id3によるとSlick:選択していない列を選択してください

select titel from Lied; 

people.map(p => (p.age, p.name ++ " (" ++ p.id.asColumnOf[String] ++ ")")).result 

私にとっては意味しています:

lieds.map(x => (x.titel)).result.map { println } 

これは機能しません。 Eclipseは言う:

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

私はこれをどのように解決すればよいですか?私はまだscala slick method I can not understand so far(これはまだslick 3.1に有効かどうかわからない)とslick 3.1のドキュメントを読んでいても、ここでいくつかの基本を組み合わせることはできないと思います。

マイ表(スリックから生成):

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

私はあなたの質問を完全に理解していませんが、多分このチュートリアルはあなたに役立ちます:http://pedrorijo.com/blog/play-slick/ – pedrorijo91

+0

あなたのリンクをありがとう。私はすでにそれを見た。残念ながら私はそこに私の質問に答える何かを見つけることができません。 質問をクリアするにはどうすればよいですか? 1つの文では、その特定のクエリの他の列の値を必要としないため、all(*)ではなく1つの列(titel)のみを選択するという滑らかな文が必要です。 – Philipp

+0

これは、 と同じくらい簡単であるはずです。 'def getTitelById(id:Long)= lieds.filter(_。id === id).map(_。titel)' 次に、 'db.run(getTitelById 1032L) 'Future [String] – Qingwei

答えて

0

問題が解決しました。

私は別の日食のクエリで遊んでいたが

import slick.driver.MySQLDriver.api._ 

代わりの

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 

を使用していた(または私?)I私のクラスに上記のimport文を追加することになりました選択を行った。

私の質問でわかるように、他のクエリが動作している間でも「マップ」を使用したいと思ったときに、私はいつも同じエラー(Eclipse error mark参照)を受け取りました。

ただし、単純にimport slick.driver.MySQLDriver.api._でそれらの輸入声明を置き換えることは私の問題を解決した。理由はまだ分かっていませんが、私たち全員が期待しているように今は機能しています。あなたが私の/ eclipseによって追加された輸入品が間違っていることを知っているなら、コメントしてください。

0

あなたはこの例で使用した場合:代わりに持つのhttps://github.com/pedrorijo91/play-slick3-steps/blob/master/app/models/User.scala

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

をあなたは

を使用してメールのみのフィールドを選択することができます
def getField(id: Long): Future[Option[String]] = { 
    dbConfig.db.run(users.filter(_.id === id).map(_.email).result.headOption) 
    } 
+0

私は同意し、hello-slick-3でそのようなクエリを作成することができました。typesafe(https://github.com/typesafehub/activator-hello-slick#slick-3.0)の例ですが、生成されたLied-Tableではまだ同じエラーがあります。一致する形は見つかりませんでした。 私のコードとの違いは分かりません... – Philipp

関連する問題