问题
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