5

我有一堂课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

4 回答 4

4

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

object User extends Magic[User]

然后 :

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

有关更多信息,请参阅文档:魔术助手

于 2011-06-03T17:00:51.923 回答
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 语法。

于 2011-06-03T22:30:04.423 回答
2

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

创建一个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 *)
于 2013-10-24T15:54:00.670 回答
0

我遇到了这个确切的问题并花了我一段时间来找出问题所在。事实证明,模型和数据库名称必须相同,区分大小写。

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

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

希望有帮助。

于 2011-07-24T13:31:07.507 回答