将scala.slick.lifted.Query转换为案例类

时间:2014-08-11 02:10:10

标签: scala slick

我有一张光滑的桌子" UserSchema"如下:

class UserSchema(tag: Tag) extends Table[User](tag, "users") {

  def name = column[String]("name", O.NotNull)
  def password = column[String]("password", O.NotNull)
  def graduatingYear = column[Int]("graduating_year", O.NotNull)
  def id = column[Int]("id", O.NotNull, O.PrimaryKey, O.AutoInc)

  def * = (name, password, graduatingYear, id.?) <> (User.tupled, User.unapply)

}

我的用户&#34;案例类如下:

case class User(name: String, password: String, graduatingYear: Int, id: Option[Int] = None)

我在TableQuery[UserSchema]对象中有users,在db对象中有数据库。

如何将以下内容转换为User对象?

db withSession { implicit session =>
  users.filter(_.id === 1)
}

此刻,我有

db withSession { implicit session =>
    val list = users.filter(_.id === id).list
    list(0)
}

哪个有效,但对我来说似乎很难看。有更好的方法吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以在Slick查询中使用地图,如下所示:

db withSession { implicit session =>
  val userlist = users.filter(_.id === id).list
    .map(user => User(user._1, user._2, user._3, Some(user._4)))
}

其中userlistUser

的集合

答案 1 :(得分:1)

list()方法返回List[User],但如果您只对第一个条目感兴趣,请使用firstOption

db withSession { implicit session =>
  val users = TableQuery[UserSchema]
  val someUser: Option[User] = users.filter(_.id === id).firstOption
}

如果查询找到了某些内容,则返回Some(User),否则None,这也更安全,因为查询没有结果可能会发生,并且调用list(0)可能会导致异常