我想按列筛选行,而我不希望在我的域类中看到这些行。所以例如我的表看起来像这样:
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
类。我几乎可以肯定第一个是不可能的,但第二个应该是可能的。怎么做?
答案 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)