scala - 映射列类型 Slick 3.1.1

标签 scala slick

我是 Slick 的新手,很难将 java.sql.date/time/timestamp 的映射映射到 jodatime。

trait ColumnTypeMappings {

  val profile: JdbcProfile
  import profile.api._

  val localTimeFormatter = DateTimeFormat.forPattern("HH:mm:ss")
  val javaTimeFormatter = new SimpleDateFormat("HH:mm:ss")

  implicit val myDateColumnType = MappedColumnType.base[LocalDate, Date](
    ld => new        java.sql.Date(ld.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis),
    d  => new LocalDateTime(d.getTime).toLocalDate
  )

  implicit val myTimeColumnType = MappedColumnType.base[LocalTime, Time](
    lt => new java.sql.Time(javaTimeFormatter.parse(lt.toString(localTimeFormatter)).getTime),
    t  => new LocalTime(t.getTime)
  )

  implicit val myTimestampColumnType = MappedColumnType.base[DateTime, Timestamp](
    dt => new java.sql.Timestamp(dt.getMillis),
    ts => new DateTime(ts.getTime, DateTimeZone.UTC)
  )

}

在自动生成的 Tables.scala 中,我包含了这样的映射:

trait Tables extends ColumnTypeMappings {
  val profile: slick.driver.JdbcDriver
  import profile.api._
  import scala.language.implicitConversions
  // + rest of the auto generated code by slick codegen
}

总结一下,我是这样使用的:

object TestTables extends Tables {
  val profile = slick.driver.MySQLDriver
}

import Tables._
import profile.api._

val db = Database.forURL("url", "user", "password", driver = "com.mysql.jdbc.Driver")
val q = Company.filter(_.companyid === 1).map(._name)
val action = q.result
val future = db.run(action)
val result = Await.result(future, Duration.Inf)

我得到一个 NullPointerException on: implicit val myDateColumnType.... 运行它时。如果删除映射,我已经验证了最后一段代码是否有效。

最佳答案

尝试在 MappedColumnTypes 的定义中将 implicit val 更改为 implicit def。之所以与Maksym Chernenko给出的答案有关对此question .通常,尚未注入(inject) JdbcProfile 驱动程序(定义 api.MappedColumnType),并且:

that causes NPE. You can either make your "mapper" val lazy, or change it from val to def (as shown below)

implicit def myDateColumnType = MappedColumnType.base[LocalDate, Date](
  ld => new java.sql.Date(ld.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis),
  d  => new LocalDateTime(d.getTime).toLocalDate
)

implicit def myTimeColumnType = MappedColumnType.base[LocalTime, Time](
  lt => new java.sql.Time(javaTimeFormatter.parse(lt.toString(localTimeFormatter)).getTime),
  t  => new LocalTime(t.getTime)
)

implicit def myTimestampColumnType = MappedColumnType.base[DateTime,  Timestamp](
  dt => new java.sql.Timestamp(dt.getMillis),
  ts => new DateTime(ts.getTime, DateTimeZone.UTC)
)

关于scala - 映射列类型 Slick 3.1.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35451513/

相关文章:

Scala:检查对象是否为数字

java - 将 Spark Java 转换为 Spark scala

scala - 使用 Slick 3 的带有可选 where 子句的动态查询

scala - 在 Slick 3 中以事务方式使用

mysql - Slick:选择列不起作用

scala - 如何在 Idea 模块中使用 gradle 设置 scala sdk?

java - 如何打包成.jar java main + jruby编译类+ ruby​​脚本?

scala - 光滑的 groupBy 中的任何字符串连接方法?

python - Scikit-learn KNN(K 最近邻)使用 Apache Spark 并行化

scala - 如何抽象光滑表之间的列定义?