我有一个班级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
。
答案 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 ;
希望有所帮助。