簡體   English   中英

如何使用 Anorm map 到 class 的一行?

[英]How can I map a Row to a class using Anorm?

我有一個 class User

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

我想 map 使用異常 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)

如何將 map SqlRow轉換為 class?


正如里卡多所建議的,我嘗試了:

object User extends Magic[User]

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

但是使用這段代碼,我得到了一個RuntimeException occured: ColumnNotFound(User.id) on:

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

有什么建議么? 我之前應該有User object 嗎? 我還有我的case class User

您可以使用魔術助手,創建一個擴展魔術的 object:

object User extends Magic[User]

然后:

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

有關更多信息,請參閱文檔: 魔術助手

我得到了它的工作:

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

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

為了使其更具可擴展性,您可以這樣做。

創建一個val和 map 將傳入數據發送給用戶。

import {classname}

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

現在,當您想從數據庫中獲取用戶並將 map 獲取給您的用戶 class 時,您可以執行以下操作:

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

我遇到了這個確切的問題並花了我一段時間來找出問題所在。 結果是 model 並且數據庫名稱必須相同,區分大小寫。

因此,對於您的示例,您的數據庫表需要被稱為“用戶”

您可以使用以下方法更改數據庫表名: RENAME TABLE users TO User;

希望有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM