将java.util.Date与Slick 3.1.0-M1一起使用

时间:2015-09-04 18:01:38

标签: mysql scala slick

我是Slick的新手。我正在使用mysql,我正在尝试从数据库中检索一些日期时间。这是我的导入

import slick.driver.MySQLDriver.simple._
import scala.slick.driver._
import java.util.Date

这里是映射为

的类的行
def creationDate = column[Date]("creation_date")

但我收到此错误

  

找不到参数tt的隐含值:slick.ast.TypedType [java.util.Date]

有没有办法在不使用String的情况下将日期时间从mysql导入java.util.Date?

谢谢

3 个答案:

答案 0 :(得分:6)

您无法在列中使用 java.util.Date 的原因是  在Slick中不支持它,请参阅Table Rows部分中的documentation

  

JdbcProfile中基于JDBC的数据库开箱即用,支持以下原始类型(由各个数据库驱动程序强加某些限制):   日期类型:java.sql.Date,java.sql.Time,java.sql.Timestamp

因此,没有提供隐式TypedType [C]。

 def column[C](n: String, options: ColumnOption[C]*)
   (implicit tt: TypedType[C]): Rep[C] = {

如果您尝试查找TypedType的子项,您会在 slick.driver.JdbcTypesComponent 中找到三个与时间相关的课程。

DateJdbcType for java.sql.Date
TimestampJdbcType for java.sql.Timestamp
TimeJdbcType for java.sql.Time

此外,定义的类型符合文档中所述的内容,三种与时间相关的类型

我在程序中使用 Timestamp Slick 3.0 ,如下所示:

import slick.driver.MySQLDriver.api._
import java.sql.Timestamp

case class Temp(creation_date: Timestamp)

class Tests(tag: Tag) extends Table[Temp](tag, "tests") {
  def creationDate = column[Timestamp]("creation_date")

  def * = creationDate <> ((creationDate: Timestamp) =>   
     Temp.apply(creationDate), Temp.unapply _)
}

通过这种方式,您只需将时间戳转换为您想要来回的任何时间相关类型,但这应该没什么大不了的。

无论如何,希望它有所帮助。

答案 1 :(得分:4)

你试过Joda-Time吗?

如果没有,你应该认真考虑一下。它有一个光滑的映射器项目https://github.com/tototoshi/slick-joda-mapper

import org.joda.time.DateTime
import com.github.tototoshi.slick.MySQLJodaSupport._

// then it works just the same
def creationDate = column[DateTime]("creation_date")

答案 2 :(得分:3)

如果要按原样使用java.util.Date, 将映射日期类型创建为Timestamp。

import slick.driver.MySQLDriver.api._
import java.util.Date
import java.sql.Timestamp

implicit def mapDate = MappedColumnType.base[Date, Timestamp](
  d => new Timestamp(d.getTime),
  identity
)