2015-04-19 85 views
4

我想在Scala應用程序中使用Slick作爲數據庫,並且遇到了如何查詢(查找)並將結果轉換爲案例類的一些問題(或者我的誤解)。,如何從查詢獲得案例類?

我沒有映射案例類,而是實際值,意圖在動態創建案例類。所以,我的表是:

object Tables { 

    class Names(tag: Tag) extends Table[Name](tag, "NAMES") { 
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc) 
     def first = column[String]("first") 
     def middle = column[String]("last") 
     def last = column[String]("last") 

     def * = (id.?, first, middle.?, last) <> ((Name.apply _).tupled, Name.unapply) 
    } 

    object NamesQueries { 

    lazy val query = TableQuery[Names] 

    val findById = Compiled { k: Rep[Long] => 
     query.filter(_.id === k) 
    } 
    } 
} 

這裏是查詢:

object NamesDAO { 

    def insertName(name: Name) { 
    NamesQueries.query += name.copy(id = None) 
    } 

    def findName(nameId: Long) = { 
    val q = NamesQueries.findById(nameId)       // AppliedCompiledFunction[Long, Query[Tables.Names, Tables.Names.TableElementType, Seq],Seq[Tables.Names.TableElementType]] 
    val resultSeq = Database.forConfig("schoolme").run(q.result) // Future[Seq[Tables.Names.TableElementType]] 
    val result = resultSeq.map { r =>        // val result: Future[(Option[Long], String, Option[String], String) => Name] 
     val rr = r.map{ name =>          // val rr: Seq[(Option[Long], String, Option[String], String) => Name] 
     Name.apply _ 
     } 
     rr.head 
    } 
    result 
    } 
} 

然而,findName方法似乎返回Future((Option[Long], String, Option[String], String) => Name)而不是Future(Name)。我究竟做錯了什麼?這僅僅是使用asInstanceOf[Name]的問題嗎?

編輯:將findName擴展爲更小的塊,併爲每個塊提供註釋,如sap1ens所示。

+0

也許值得將findName方法拆分爲多行並使用顯式類型......至少對於調試來說,它會容易理解。 – sap1ens

回答

0

好吧,我會被詛咒的。 以上sap1ens註釋,我打破了findName多個步驟(和編輯問題)。但在那之後,我回去並給了我的val一個明確的類型,並且工作。請看這裏:

def findName(nameId: Long) = { 
    val q = NamesQueries.findById(nameId)       
    val resultSeq: Future[Seq[Name]] = Database.forConfig("schoolme").run(q.result) 
    val result = resultSeq.map { r => 
     val rr = r.map{ name => 
     name 
     } 
     rr.head 
    } 
    result 
    } 

所以,類型推斷是這次(/我)的罪魁禍首。記住,記住。

+3

只需保留幾行代碼即可:「r.map {name => name}」實際上沒有任何功能。您只需將一個Seq [Name]映射到另一個'Seq [Name]'。爲了得到第一個結果,你可以編寫'val result = resultSeq.map(r => r.head)',它可以用'val result = resultSeq.map(_。head) – Roman