2017-02-20 8 views
2

私はPlayで作業中です! 2.5、Slick 3、およびPostgreSQL 9.6です。Slick:パラメータeの暗黙の値が見つかりませんでした:slick.jdbc.SetParameter [Option [java.util.UUID]]

私はオプションUUIDでシンプルな無地SQLクエリを使用しようとしているが、私はこのエラーを取得:

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

をそしておそらくあなたの更新SQLasUpdateを追加する必要があります

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

それはコンパイルが、私は持っていないために、UUIDにVARCHARをキャストする必要がありPostgreSQLのエラー($ {gaClientId.userId} :: uuid)。私はvarchar tp uuidにuuidを使わないでそれを行う方法があると思うが、私はそれを見つけられなかった。 – Simon

+0

DB内のフィールドの型としてUUIDがあると言っていますか? –

+0

はい、まさに(申し訳ありませんが私の質問がそれについて明確でない場合) – Simon

関連する問題