代码之家  ›  专栏  ›  技术社区  ›  Nogurenn

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

  •  1
  • Nogurenn  · 技术社区  · 8 年前

    我使用默认的 PostgresProfile 我想让它产生 java.time.OffsetDateTime 处理时的列 java.sql.Timestamp 类型。我已经开始使用rawType了,但我不知道应该覆盖什么才能使用导入的隐式映射器。

    当我运行codegen任务时,它会导入 SlickColumnMappers 但就这么多了。生成的列继续为 Java语言sql。时间戳 .

    这一直是我的主要障碍。非常感谢您的帮助。

    映射器

    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)
            }
          }
        }
      }
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Edmondo    8 年前

    列映射允许您在行模型中使用自定义类,但不会影响代码生成。为了更改代码生成,您需要重写 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
            }
          }
    }