我正在使用Slick 2.0,我有以下User
案例类:
case class User(id: Option[Long], email: String, password: String)
class Users(tag: Tag) extends Table[User](tag, "user") {
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def email = column[String]("email")
def password = column[String]("password")
def * = (id.?, email, password) <> ((User.apply _).tupled, User.unapply _)
}
我有以下功能通过他们的数据库ID获取用户:
def findOneById(id: Long) = DB.withSession { implicit session =>
val result = (for {
u <- users if u.id === id
} yield (u.id, u.email, u.password)).first
User(Option(result._1), result._2, result._3)
}
是否有更简单的方法将Seq回复转换回result
案例类?
答案 0 :(得分:3)
好的,我找到了答案。我从@benji获得了部分内容,部分来自这篇文章:Converting scala.slick.lifted.Query to a case class。
以下返回选项[用户],而不是使用for comprehension,这正是我需要的:
def findOneById(id: Long):Option[User] = DB.withSession { implicit session =>
users.filter(_.id === id).firstOption
}
答案 1 :(得分:2)
为了理解,使用sql连接更容易。例如:
def findOneById(id: Long) = DB.withSession { implicit session =>
val query = for {
u <- users if u.id === id
t <- token if t.user_id = u.id && token.isActive === `A`
} yield u
query.firstOption
}
答案 2 :(得分:0)
要将结果转换为用户案例类列表,您只需执行
即可 result.map(User.tupled)
但是,如果您的数据模型是合理的,我将只会工作。例如:您的用户案例类将id作为可选,因为它是DB中的主键,这是错误的。