Как я могу сопоставить строку с классом, используя Anorm? - PullRequest
5 голосов
/ 03 июня 2011

У меня есть класс 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) on:

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

Есть предложения? Предполагается ли, что объект User находится в строке прямо перед этим? и у меня все еще есть case class User.

Ответы [ 4 ]

4 голосов
/ 04 июня 2011

Я понял, что работает с этим:

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

Каждая строка user является словарем.Я не очень хорошо знаю синтаксис Scala.

4 голосов
/ 03 июня 2011

Вы можете использовать Магический помощник, создать объект, расширяющий магию:

object User extends Magic[User]

Затем:

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

Для получения дополнительной информации см. Документ: Магический помощник

1 голос
/ 24 октября 2013

Чтобы сделать его немного более масштабируемым, вы можете сделать это.

Создать val и отобразить входящие данные для пользователя.

import {classname}

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

Теперь, когда вы хотите получитьпользователь из базы данных и сопоставить его с вашим классом пользователя, вы можете сделать:

val selectUsers = SQL("SELECT id, name FROM users").as(parsedValueOfUser *)
0 голосов
/ 24 июля 2011

Я столкнулся с этой конкретной проблемой и взял меня некоторое время, чтобы выяснить, что не так. Оказалось, что модель и имена баз данных должны быть одинаковыми, с учетом регистра.

Так что для вашего примера таблицу базы данных нужно будет назвать «Пользователь»

Вы можете изменить имя таблицы базы данных, используя: RENAME TABLE users TO User ;

Надеюсь, это поможет.

...