[英]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.