【问题标题】:Slick 3.0. How to map slick table of tuples to my domain class?光滑的 3.0。如何将光滑的元组表映射到我的域类?
【发布时间】:2016-08-08 09:28:14
【问题描述】:

我想按列过滤我不想在我的域类中看到的行。例如,我的表格如下所示:

  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)

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

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

所以我的问题可以通过两种方式解决。像UserTable[User] 一样定义UserTable,并且仍然以某种方式通过active 列对其进行过滤。或者像现在定义的那样定义 UserTable 并将元组转换为 User 类。我几乎可以肯定第一个是不可能的,但第二个应该是可能的。如何做到这一点?

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:

    我玩过 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)
    

    【讨论】:

      猜你喜欢
      • 2021-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多