Slick: как получить атрибут объекта в наборе результатов?

Учитывая следующий класс Scala, улучшенный с помощью Slick:

class Users(tag: Tag) extends Table[(Int, String, String)](tag, "users") {

  def id: Rep[Int] = column[Int]("sk", O.PrimaryKey)
  def firstName: Rep[String] = column[String]("first_name")
  def lastName: Rep[String] = column[String]("last_name")

  def * : ProvenShape[(Int, String, String)] = (id, firstName, lastName)
}

Мне нужно напечатать фамилии в цикле запроса:

val db = Database.forConfig("dbconfig")
try {
    val users: TableQuery[Users] = TableQuery[Users]
    val action = users.result
    val future = db.run(action)

    future onComplete {
      case Success(u) => u.foreach { user => println("last name : " + **user.lastName**) }
      case Failure(t) => println("An error has occured: " + t.getMessage)
    }

} finally db.close

Но Scala не распознает user.lastName (я получаю сообщение об ошибке «Scala не распознает символ»). Как печатать фамилии?


person ps0604    schedule 22.12.2015    source источник


Ответы (1)


Проблема в том, что вы используете Table[(Int, String, String)]. Таким образом, user в вашем случае является экземпляром типа (Int, String, String), поэтому у него нет lastName. Используйте user._3, чтобы получить третий элемент кортежа (фамилию). Еще лучше было бы использовать класс case вместо кортежа:

case class DBUser(id: Int, firstName: String, lastName: String)

class Users(tag: Tag) extends Table[DBUser](tag, "users") {

  def id: Rep[Int] = column[Int]("sk", O.PrimaryKey)
  def firstName: Rep[String] = column[String]("first_name")
  def lastName: Rep[String] = column[String]("last_name")

  def * = (id, firstName, lastName) <> (DBUser.tupled, DBUser.unapply)
}
person danielnixon    schedule 23.12.2015
comment
Спасибо, сработало отлично. Тем не менее, мне нужно определить столбцы дважды (в DBUser и Users). Есть ли способ определить столбцы один раз? - person ps0604; 23.12.2015