具有值类字段的实体的 Doobie 查询

问题描述

我使用 Doobie 来管理数据库持久性。我在实体 Foo 中使用 value class 字段,即

    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],LocalDateTime)].contramap {e => (e.oid,e.resource.value,e.createdOn.value}

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

解决方法

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._

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...