使用 Slick 3.1 时使用 Plain SQL 枚举

Enum in Plain SQL when using Slick 3.1

我正在使用 Slick 3.1.0 和 Slick-pg 0.10.0。我有一个枚举:

object UserProviders extends Enumeration {
  type Provider = Value
  val Google, Facebook = Value
}

根据测试用例,只需将以下 implicit 映射器添加到我的自定义驱动程序中,列映射器就可以正常工作。

implicit val userProviderMapper = createEnumJdbcType("UserProvider", UserProviders, quoteName = true)

然而,当使用plain SQL时,我遇到了以下编译错误:

could not find implicit value for parameter e: slick.jdbc.SetParameter[Option[models.UserProviders.Provider]]

我找不到任何关于此的文档。我怎样才能用光滑的枚举写出普通的 SQL ?谢谢。

你需要在范围内有一个类型 SetParameter[T] 的隐含类型,它告诉 slick 如何从它还不知道的一些自定义类型 T 设置参数。例如:

  implicit val setInstant: SetParameter[Instant] = SetParameter { (instant, pp) => 
    pp.setTimestamp(new Timestamp(instant.toEpochMilli))
  }

pp的类型是PositionedParameters

您可能还需要告诉 slick 如何将查询结果提取到它不知道的某些自定义类型 T 中。为此,您需要一个隐式的 GetResult[T] 范围。例如:

  implicit def getInstant(implicit get: GetResult[Long]): GetResult[Instant] = 
    get andThen (Instant.ofEpochMilli(_))