仅使用类名字符串创建对象实例。

时间:2013-11-19 13:42:34

标签: scala playframework-2.0 slick

我是斯卡拉的新手并且在我去的时候试图解决问题。我正在使用Play 2.x框架并使用Scala构建我的应用程序。我有一个定义的路线

GET /:tableName   controllers.Application.getTable(tableName)

在控制器中,我想取表格的名称并像我一样使用它。例如,在db中有一个名为People的表。我希望它映射到具有getAll函数的People的Slick模型。我查看了typeof [t],但无法让它工作。下面是我想做的一个例子。

def getTable(tableName: String) = Action {

    Ok(Json.toJson(typeOf[tableName].getAll))
  }

1 个答案:

答案 0 :(得分:2)

你需要更多的东西才能完成这项任务;)首先,Slick需要一个数据库会话,因此需要在某处进行处理。这意味着光滑表getAll本身不起作用。

我会做这样的事情(抱歉,在没有IDE的情况下输入它,所以它可能无法编译):

case class Person(...)
object People extends Table[Person](PeopleDAO.table) {
  def * = ...
}

trait DAO[T] {
  val table: String
  def getAll: Seq[T]
}

object PeopleDAO extends DAO[Person] {
  override val table = "people"
  def getAll = {
    DB withSession { implicit session =>
      Query(People).list
    }
  }
}
object Controller {
  def getTable(tableName: String) = Action {
    val dao: DAO[_] = tableName.toLowerCase match {
      case PeopleDAO.table => PeopleDAO
      case _ => throw new IllegalArgumentException("Not a valid table.")
    }
    Ok(Json.toJson(dao.getAll))
  }
}