Converting scala.slick.lifted.Query to a case class

风流意气都作罢 提交于 2019-12-24 17:26:15

问题


I have a slick table "UserSchema" as follows:

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)

}

My "User" case class is as follows:

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

I have a TableQuery[UserSchema] in a users object, and a database in a db object.

How can I convert the following into a User object?

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

At the moment, I have

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

which works, but seems ugly to me. Is there a better way to do this?

Thanks for the help.


回答1:


The list() method returns a List[User] but if you are only interested in the first entry use firstOption:

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

Which returns Some(User) if the query found something, else None, this is also more safe as it could happen that the query has no result and calling list(0) could result in an exception.




回答2:


You can use a map on the Slick query like this:

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

where userlist is a collection of User.



来源:https://stackoverflow.com/questions/25234990/converting-scala-slick-lifted-query-to-a-case-class

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!