如何使用Anorm将行映射到类?

时间:2011-06-03 14:14:29

标签: scala map stream playframework anorm

我有一个班级User

case class User (id: Int, name: String)

我想使用Anorm Stream API映射查询中的行。我试过这段代码:

val selectUsers = SQL("SELECT id, name FROM users")
val users = selectUsers().map(
    user => User(0, user.name)
).toList

但是我收到了一个错误:

Error raised is : value name is not a member of play.db.anorm.SqlRow

user => User(0, user.↓name)

如何将SqlRow映射到班级?


根据里卡多的建议,我试过了:

object User extends Magic[User]

val users: List[User] = SQL("SELECT * FROM users").as(User*)

但是使用此代码我得到了RuntimeException occured : ColumnNotFound(User.id)

val users: List[User] = SQL("SELECT * FROM users").as(User*)

有什么建议吗?我是否希望之前的行中有User个对象?我还有case class User

4 个答案:

答案 0 :(得分:4)

你可以使用魔术助手,创建一个扩展魔法的对象:

object User extends Magic[User]

然后:

val users:List[User] = SQL("select * from User").as(User*)

有关详细信息,请参阅文档:Magic helper

答案 1 :(得分:4)

我得到了它的工作:

val selectUsers = SQL("SELECT id, name FROM users")
val users = selectUsers().map(
    user => new User(user[Int]("id"), user[String]("name"))
).toList

每一行user都是字典。我不太了解Scala语法。

答案 2 :(得分:1)

为了使其更具可扩展性,您可以这样做。

创建val并将传入的数据映射到用户。

import {classname}

val parsedValueOfUser = {
 get[Int]("id") ~
 get[String]("name") map {
   case id ~ name => User(id, name)
 }
}

现在,当您想从数据库中获取用户并将其映射到User类时,您可以执行以下操作:

val selectUsers = SQL("SELECT id, name FROM users").as(parsedValueOfUser *)

答案 3 :(得分:0)

我遇到了这个问题并花了一些时间来指出错误。事实证明,模型和数据库名称必须相同,区分大小写。

因此,对于您的示例,您的数据库表需要被称为“用户”

您可以使用以下命令更改数据库表名: RENAME TABLE users TO User ;

希望有所帮助。