如何将查询结果转换为案例类



我正在使用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 User case 类?

好的,我找到了答案。我部分来自@benji,部分来自这篇文章:将scala.slick.lifted.Query转换为案例类。

下面没有使用 a 进行理解,而是返回一个 Option[User],这正是我所需要的:

def findOneById(id: Long):Option[User] = DB.withSession { implicit session =>
  users.filter(_.id === id).firstOption
}

对于理解,使用 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
}

要将结果转换为用户案例类列表,您可以简单地执行以下操作

result.map(User.tupled)

但是,只有在您的数据模型是一致的情况下,我才会工作。例如:您的用户案例类将 id 作为可选,因为它是数据库中的主键,这是错误的。

最新更新