光滑3.0。如何将元组的光滑表映射到我的域类?

时间:2016-08-08 09:28:14

标签: scala slick slick-3.0

我想按列筛选行,而我不希望在我的域类中看到这些行。所以例如我的表看起来像这样:

  class UserTable(tag: Tag) extends Table[(Int, String, Boolean)](tag, "users") {

    def id = column[Int]("id")

    def name = column[String]("name")

    def active = column[Boolean]("active")

    override def * = (id, name, active)

  }

我的域类是这样的:

case class User(id: Int, name: String)

出于某种原因,我不想在active课程中提交User。但我希望查询产生User的结果。而且我不想映射未来。像这样:

val activeUsers: Future[Seq[User]] = db.run(query.filter(_.active === true) /* how to convert it here? */)

所以我的问题可以通过两种方式解决。定义UserTable,例如UserTable[User],并以某种方式按active列过滤它。或者定义现在定义的UserTable并将元组转换为User类。我几乎可以肯定第一个是不可能的,但第二个应该是可能的。怎么做?

1 个答案:

答案 0 :(得分:0)

我和Slick玩了一点。如果我不想错过一些东西,对我来说似乎不可能实际上非常容易,我可以使用查询中不存在于最终类中的列:

object SlickMain {

  def main(args: Array[String]) {

    import scala.concurrent.ExecutionContext.Implicits.global

    val db = Database.forConfig("slick.db")

    val query = TableQuery[UserTable]

    await {
      db.run(query ++= Seq(
        User(1, "first"),
        User(2, "second")
      ))
    }

    val users = for {
      nonActiveUsers <- query.filter(_.active === false).result
      _ <- DBIO.sequence(nonActiveUsers.map(us => query.filter(_.id === us.id).map(_.active).update(true)))
    } yield nonActiveUsers

    val firstResult: Seq[User] = await(db.run(users))
    println(s"First batch: $firstResult")
    // prints vector with two users

    val secondResult: Seq[User] = await(db.run(users))
    println(s"Second batch: $secondResult")
    // prints empty vector
  }

  def await[T](f: => Future[T]) = Await.result(f, Duration.Inf)

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

    def id = column[Int]("id")

    def name = column[String]("name")

    def active = column[Boolean]("active")

    override def * = (id, name, active) <>(create, extract)

    def create(t: (Int, String, Boolean)): User = User(t._1, t._2)

    def extract(u: User): Option[(Int, String, Boolean)] = Some((u.id, u.name, false))

  }

}


case class User(id: Int, name: String)