我有这个使用默认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)
}
}
}
}
}
列映射允许您在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
}
}
}