2016-02-17 75 views
2

我是新来的Slick,并且很难获得映射到jodatime的java.sql.date/time/timestamp映射。映射列类型Slick 3.1.1

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上:隐式val myDateColumnType ....运行时。我已经验证过,如果我删除映射,这最后一块代码将起作用。

+0

您好,我没有尝试我们的代码,但如果u有jodatime的许多用途,U可以试试光滑-PG,https://github.com/tminglei /光滑-PG。它提供了jodatime和其他流行的类型映射。 –

回答

0

所以我认为问题可能是您在Tables.scala中扩展ColumnTypeMappings。该文档没有说清楚,但我认为不应该触及与数据库相关的自动生成的代码,因为浮动用于映射数据库中的行,然后通过ColumnTypeMappings扩展TestTables以在执行隐式转换时执行隐式转换你从数据库中得到结果。

我还没有特别钻研光滑3.x,所以我可能是错的,但我认为这是有道理的。

编辑:没有,我错了:(道歉

+0

你确定已经导入了java.sql.Date或LocalDateTime吗?这些将需要在隐式转换的范围内 –

4

尝试改变implicit val在你的MappedColumnTypes定义implicit def为什么涉及通过Maksym Chernenko给这个question答案的原因通常,JdbcProfile。驱动程序(定义api.MappedColumnType)尚未注入着呢,:

导致NPE你可以让你的“映射” vallazy,或 从更改至def(如下图所示)

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) 
)