簡體   English   中英

Slick:找不到參數 e 的隱式值:slick.jdbc.SetParameter[Option[java.util.UUID]]

[英]Slick: could not find implicit value for parameter e: slick.jdbc.SetParameter[Option[java.util.UUID]]

我正在玩游戲。 2,5。 光滑 3 和 PostgreSQL 9.6。

我正在嘗試使用帶有可選UUID的簡單普通SQL查詢,但出現此錯誤:

Slick: could not find implicit value for parameter e: slick.jdbc.SetParameter[Option[java.util.UUID]]

我的案例 class 看起來像

final case class GaClientId(ip: String, userId: Option[UUID], clientId: String)

我的查詢是這樣的:

db.run(       
  sql"""
    INSERT INTO ga_client_id(ip, user_id, clientId) VALUES (
    ${gaClientId.ip}, ${gaClientId.userId}, $gaClientId.userId.orNull)
    ON CONFLICT DO NOTHING;""")

我試圖添加這個:

implicit val getUUIDContent: GetResult[GaClientId] =
  GetResult(r => GaClientId(r.<<, r.nextStringOption().map(UUID.fromString), r.<<))

但沒有結果。

我怎樣才能做到這一點?

正如錯誤所暗示的那樣,您應該指定SetParameter而不是GetParameter 它應該是這樣的:

  implicit val uuidSetter = SetParameter[Option[UUID]] {
    case (Some(uuid), params) => params.setString(uuid.toString)
    case (None, params) => params.setNull(Types.VARCHAR)
  }

然后您可能應該將asUpdate添加到您的更新SQL

  db.run((sql"""
      INSERT INTO ga_client_id(ip, user_id, clientId) VALUES (
      ${gaClientId.ip}, ${gaClientId.userId}, ${gaClientId.clientId})
      ON CONFLICT DO NOTHING;
  """).asUpdate)

根據@Paul Doelga 的回答,您可以另外嘗試

  db.run((sql"""
      INSERT INTO ga_client_id(ip, user_id, clientId) VALUES (
      ${gaClientId.ip}, ${gaClientId.userId}::uuid, ${gaClientId.clientId})
      ON CONFLICT DO NOTHING;
  """).asUpdate)

我最初得到的答案是

https://github.com/skinny-framework/skinny-framework/issues/301

我猜失敗的主要原因是 Postgres 需要UUID類型的參數,但是JDBC不支持它,所以你必須將它轉換為String ,並在 SQL 中轉換回UUID

暫無
暫無

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

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