2013-07-10 59 views
1

如何使用Slick返回映射對象?使用下面的代碼,我的查詢返回List [(Int,String)],而不是像我想要的List [Task]。使用Slick是不可能的,或者我是否以錯誤的方式思考Slick?它不是ORM嗎?我試圖返回一個查詢,並在使用Play2框架的視圖模板中使用它。我想最終訪問像task.id task.label等對象...謝謝。使用Slick返回映射對象

import play.api.Play.current 
import play.api.db._ 
import scala.slick.driver.H2Driver.simple._ 

case class Task(id: Int, label: String) 

object Task extends Table[(Int, String)]("TASKS") { 

    lazy val database = Database.forDataSource(DB.getDataSource()) 

    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc) 

    def label = column[String]("LABEL") 

    def * = id ~ label 

    def all() : List[Task] = database.withSession { implicit db: Session => 
    Query(Task).list 
    } 
} 
+0

請注意,如果將表單中的單例對象放置在靜態位置(包或其他單例對象)中,則可能導致Slick 1.x出現問題。爲了安全起見,可以使用class和vals,或者將singleton對象放在classes/traits中作爲成員。 – cvogt

+0

@cvogt我以前沒有聽說過這個,我見過的大多數示例都使用單例。你能提供一個關於爲什麼應該避免的更多信息的鏈接嗎? –

+0

相應的斯卡拉bug報告https://issues.scala-lang.org/browse/SI-3764 – cvogt

回答

0

問題出在您如何定義表格。試着改變你的表定義:

case class Task(id: Int, label: String) 
object Task extends Table[Task]("TASKS") { 
    lazy val database = Database.forDataSource(DB.getDataSource()) 
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc) 
    def label = column[String]("LABEL") 
    def * = id ~ label <> (Task.apply _, Task.unapply _) 
    def all() : List[Task] = database.withSession { implicit db: Session => 
    Query(Task).list 
    } 
} 

不同的是,該類型PARAM我傳遞給TableTask,而不是(Int, String)。這應該可以解決您的問題。

+0

我得到了同樣的錯誤: 類型不匹配;找到:List [(Int,String)] required:List [models.Task] – nek4life

+0

@ nek4life,我更新了我現在認爲是正確的答案。 – cmbaxter

+0

謝謝!這是問題。 我在使用文檔[here](http://slick.typesafe.com/doc/1.0.0/gettingstarted.html),他們顯示與列匹配的類型參數。我想我必須這樣指定我的桌子。有關類型參數的更多信息以及它的功能將不勝感激。再次感謝! – nek4life