2017-02-20 66 views
2

我正在用Play進行工作! 2.5,Slick 3和PostgreSQL 9.6。Slick:無法找到參數e的隱式值:slick.jdbc.SetParameter [Option [java.util.UUID]]

我試圖用一個簡單的純SQL查詢與可選UUID,但我得到這個錯誤:

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

我的情況下類是什麼樣子

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

但沒有結果。

我該怎麼做?

回答

1

由於錯誤意味着您應該指定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) 
+0

它編譯,但我要的VARCHAR轉換爲UUID爲了不有PostgreSQL錯誤(帶有$ {gaClientId.userId} :: uuid)。我懷疑有沒有辦法做到這一點,但沒有找到varchar tp uuid。 – Simon

+0

所以你說你有UUID作爲數據庫中的字段類型? –

+0

是的,正好(抱歉,如果我的問題不明確) – Simon

相關問題