0

我正在使用Doobie来管理数据库持久性。我在我的实体中使用值类Foo字段,即

    case class CreatedOn(value: LocalDateTime) extends AnyVal
    case class Resource(value: String) extends AnyVal
    case class Foo(id: Option[Int], resource: Resource, createdOn: CreatedOn)

    implicit fooRead: Read[Foo] = Read[(Option[Int], String, LocalDateTime)].map {
        case (oid, resource, createdOn) => Foo(oid, Resource(resource), CreatedOn(createdOn))
    }

    implicit fooWrite: Write[Foo] = Write[(Option[Int], String, LocalDateTime)].contramap {e => (e.oid, e.resource.value, e.createdOn.value}

然而编译器抱怨缺少Read[(Int, String, LocalDateTime)].map {... 关于如何解决这个问题的任何建议?首先,当涉及到实体时,使用值类是一个坏主意吗?谢谢

4

1 回答 1

1

Doobie 能够将查询读入case classes。如果您将案例类想象为元组,并且您可以将它们展平,那么这就是 Doobie 在您将事物查询到案例类时所做的事情。

Foo(Some(1), Resource("test"), CreatedOn(time))
(Some(1), Tuple1("test"), Tuple1(time))
(Some(1), "test", time) // (Option[Int], String, LocalDateTime)

如果您的推导失败,您可以检查以下哪些字段:

sql"".query[Int]
sql"".query[String]
sql"".query[LocalDateTime]

编译失败的行告诉您缺少的实例。

根据我的经验,它是时间实例。您必须单独导入它们,您可能没有导入它们

doobie.implicits.javatime._
于 2021-01-18T09:16:15.880 回答