【问题标题】:Return a mapped object using Slick使用 Slick 返回映射对象
【发布时间】:2013-07-11 09:05:35
【问题描述】:

如何使用 Slick 返回映射对象?使用以下代码,我的查询返回 List[(Int, String)] 而不是我想要的 List[Task]。这不可能使用 Slick 还是我以错误的方式思考 Slick 不是 ORM 吗?我正在尝试使用 Play2 框架返回查询并在视图模板中使用它。我想最终访问 task.id task.label 等对象...谢谢。

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
  }
}

【问题讨论】:

  • 请注意,如果将单例对象放置在静态位置(包或其他单例对象),则在 Slick 1.x 中为 Table 使用单例对象可能会导致问题。为了安全起见,要么使用类和 val,要么将单例对象作为成员放在类/特征中。
  • @cvogt 我以前没有听说过这个,我见过的大多数例子都使用单例。您能否提供一个链接,以获取有关为什么应该避免这种情况的更多信息?
  • 对应的Scala错误报告issues.scala-lang.org/browse/SI-3764

标签: scala playframework-2.0 slick


【解决方案1】:

问题在于您如何定义表格。尝试将表定义更改为:

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
  }
}

不同之处在于我传递给Table 的类型参数是Task 而不是(Int, String)。这应该可以解决您的问题。

【讨论】:

  • 我得到同样的错误:类型不匹配;找到:List[(Int, String)] 需要:List[models.Task]
  • @nek4life,我更新了我现在认为正确的答案。
  • 谢谢!这就是问题所在。我正在使用文档here,其中显示了与列匹配的类型参数。我想我必须这样指定我的桌子。任何有关类型参数及其作用的更多信息将不胜感激。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2018-05-30
  • 2021-02-17
  • 1970-01-01
  • 2021-09-10
  • 2019-07-06
  • 1970-01-01
  • 2023-02-09
  • 2017-01-01
相关资源
最近更新 更多