簡體   English   中英

如何將 java.util.UUID 轉換為 doobie.syntax.SqlInterpolator.SingleFragment?

[英]How do I convert a java.util.UUID to doobie.syntax.SqlInterpolator.SingleFragment?

我正在嘗試使用 doobie、http4s 和 circe 設置一個帶有數據庫的簡單 Scala 應用程序。

如何將 java.util.UUID 轉換為 doobie.syntax.SqlInterpolator.SingleFragment ?

final case class User(id: UUID, details: UserDetails)
  implicit val userDecoder: Decoder[User] = deriveDecoder[User]
  implicit def userEntityDecoder[F[_]: Sync]: EntityDecoder[F, User] = jsonOf

  implicit val userEncoder: Encoder[User] = deriveEncoder[User]
  implicit def userEntityEncoder[F[_]: Applicative]: EntityEncoder[F, User] = jsonEncoderOf

  implicit val put: Put[User] =
    Put[Json].contramap(_.asJson)

  implicit val get: Get[User] =
    Get[Json].temap(_.as[User].left.map(_.show))

[info] welcome to sbt 1.3.12 (N/A Java 14.0.1)
[info] loading global plugins from /Users/ryan/.sbt/1.0/plugins
[info] loading settings for project bobbymoore-build from plugins.sbt ...
[info] loading project definition from /Users/ryan/fullStackRyan/bobbymoore/project
[info] loading settings for project root from build.sbt ...
[info] set current project to bobbymoore (in build file:/Users/ryan/fullStackRyan/bobbymoore/)
[info] sbt server started at local:///Users/ryan/.sbt/1.0/server/90f560b1e0964865fc4c/sock
sbt:bobbymoore> compile
[info] Compiling 1 Scala source to /Users/ryan/fullStackRyan/bobbymoore/target/scala-2.13/classes ...
[error] /Users/ryan/fullStackRyan/bobbymoore/src/main/scala/com/c/bobbymoore/database/UserQueries.scala:24:20: type mismatch;
[error]  found   : java.util.UUID
[error]  required: doobie.syntax.SqlInterpolator.SingleFragment
[error]          |  ${user.id},
[error]                    ^
[error] /Users/ryan/fullStackRyan/bobbymoore/src/main/scala/com/c/bobbymoore/database/UserQueries.scala:34:21: type mismatch;
[error]  found   : java.util.UUID
[error]  required: doobie.syntax.SqlInterpolator.SingleFragment
[error]          |WHERE id=$id
[error]                     ^
[error] two errors found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 2 s, completed 13 Oct 2020, 16:31:46

如果您使用的是 PostgreSQL 並且 Java 中的 UUID 轉換為 Postgres 表中的 UUID 列,那么您必須使用DoobiePostgres 擴展

// other doobie imports
import doobie.postgres._
import doobie.postgres.implicits._

sql"""SELECT id, name FROM users WHERE id = ${user.id}""".query[(UUID, String)]

如果您不使用 PSQL 並且此 UUID 映射到 TEXT 字段,則您必須在查詢中自己映射:

sql"""SELECT id, name FROM users WHERE id = ${user.id.toString}"""
  .query[(String, String)]
  .map { case (uuid, name) => (UUID.fromString(uuid), name) }

或定義您自己的Meta[UUID]實例,例如

implicit val uuidMeta: Meta[UUID] =
  Meta[String].imap[UUID](UUID.fromString)(_.toString)

如果您想為包含 UUID 的 case 類派生一個實例,則需要這個。 Postgres 擴展庫提供了一種與 PSQL 實現相匹配的擴展庫。

如果您在 DB 端使用例如Array[Byte]或其他一些數字表示來表示 UUID,則您肯定必須定義自己的 Meta 實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM