scala Zio Quill:如何概括不同实体共享的操作?

kr98yfug  于 2022-11-09  发布在  Scala
关注(0)|答案(1)|浏览(134)

假设我们有以下两个案例类:

case class Person(name:String, age:Int, createdAt:LocalDate, lastModified:LocalDate)
case class Address(street:String, zip:Int, createdAt:LocalDate, lastModified:LocalDate)

我希望能够做到以下几点:

for {
    p <- query[Person]
           .changedAfter(lift(LocalDate.of(2022,1,1)))
    a <- query[Address].join(a => a.ownerId == p.id)
            .changedAfter(lift(LocalDate.of(2022,1,1)))
} yield (p, a)

其中.changedAfter()将适用于包含createdAtlastModified字段的任何实体。
我将如何继续创建这样的修改?

a64a0gku

a64a0gku1#

您可以创建这样的扩展方法。

import io.getquill._
import java.time._

val ctx = new SqlMirrorContext(PostgresDialect, SnakeCase)

import ctx._

trait EntityLike {
  val createAt: LocalDate
  val lastModified: LocalDate
}

case class Person(name: String, age: Int, createAt: LocalDate, lastModified: LocalDate) extends EntityLike

implicit class EntityOps[A <: EntityLike](q: Query[A]) {
  val changeAfter = quote { (d: LocalDate) =>
    q.filter(e => infix"${e.createAt} < ${d}".as[Boolean])
  }
}
val d = LocalDate.of(2000, 1, 1)
val m = ctx.run(query[Person].changeAfter(lift(d)))

println(m)

相关问题