我想在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所示。
也許值得將findName方法拆分爲多行並使用顯式類型......至少對於調試來說,它會容易理解。 – sap1ens