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

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

on

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

如何将 SqlRow 映射到一个类?


按照 Ricardo 的建议,我尝试了以下方法:

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
您可以使用Magic helper,创建一个扩展 Magic 的对象:
object User extends Magic[User]

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

请查看文档以获取更多信息:魔法帮助器

1
这个方法对我不起作用的原因是我正在使用PostgreSQL作为数据库,而在PostgreSQL中无法使用Magic - Jonas

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
为了使其更具可扩展性,您可以这样做。
创建一个“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 *)

0
我遇到了这个确切的问题,花了我一段时间才弄清楚问题所在。原来是模型和数据库名称必须相同,区分大小写。
因此,对于您的示例,您的数据库表需要被称为“User”。
您可以使用以下命令更改数据库表名: RENAME TABLE users TO User; 希望能有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接