我是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:隐式val myDateColumnType ....运行时。我已经验证了如果删除映射,最后一段代码就可以工作。
答案 0 :(得分:5)
尝试在implicit val
的定义中将implicit def
更改为MappedColumnTypes
。其原因与Maksym Chernenko给出question给出的答案有关。通常,JdbcProfile
驱动程序(定义{{1}})尚未注入,并且:
导致NPE。你可以制作你的" mapper"
api.MappedColumnType
val
,或更改它 从lazy
到val
(如下所示)
def
答案 1 :(得分:0)
所以我认为问题可能是你在Tables.scala中扩展了ColumnTypeMappings。文档没有说清楚,但我认为不应该触及与数据库相关的自动生成代码,因为光滑使用它来映射数据库中的行,然后通过ColumnTypeMappings扩展TestTables来执行隐式从数据库中获得结果时的转换。
我还没有特别钻研光滑的3.x,所以我可能错了,但我认为这是有道理的。
编辑:不,我错了:(。道歉