Slick 3在自定义SourceCodeGenerator中使用自定义MappedColumnType

问题描述 投票:1回答:1

我有这个使用默认PostgresProfile的自定义源代码生成器,我希望它在处理java.time.OffsetDateTime类型时生成java.sql.Timestamp列。我已经到了使用rawType但我不明白我应该覆盖什么才能使用导入的隐式映射器。

当我运行codegen任务时,它会导入SlickColumnMappers,但这就是它的进展。生成的列继续为java.sql.Timestamp

这对我来说是一个主要障碍。非常感谢帮助。

映射器

object SlickColumnMappers {
  implicit val TimestampToOffsetDateTime = MappedColumnType.base[OffsetDateTime, Timestamp](
    dt => Timestamp.from(dt.withOffsetSameInstant(ZoneOffset.UTC).toInstant),
    ts => OffsetDateTime.ofInstant(ts.toInstant, ZoneOffset.UTC)
  )
}

源代码生成器

new SourceCodeGenerator(model) {
  override def Table = new Table(_) {
    override def code: Seq[String] = Seq(
      "import helpers.SlickColumnMappers._"
    ) ++ super.code

    override def Column = new Column(_) {
      override def defaultCode = v => {
        def raw(v: Any) = rawType match {
          case "String" => "\"" + v + "\""
          case "Long" => v + "L"
          case "Float" => v + "F"
          case "Char" => "'" + v + "'"
          case "scala.math.BigDecimal" => s"scala.math.BigDecimal($v)"
          case "Byte" | "Short" | "Int" | "Double" | "Boolean" => v.toString
        }
        v match {
          case Some(x) => s"Some(${raw(x)})"
          case None => "None"
          case x => raw(x)
        }
      }
    }
  }
}
scala code-generation slick slick-3.0
1个回答
0
投票

列映射允许您在Row模型中使用自定义类,但不会影响代码生成。为了更改代码生成,您需要覆盖Table中的SourceCodeGenerator方法

  override def Table = new Table(_) {


    override def Column = new Column(_){
      override def rawType = {
        val superRawType = super.rawType
        superRawType match {
          case "java.sql.Timestamp" => "java.time.ZonedDateTime"
          case "java.sql.Date" => "java.time.LocalDate"
          case x => x
        }
      }
}
© www.soinside.com 2019 - 2024. All rights reserved.