使用 java.util.Date 与 Slick 3.1.0-M1

Use java.util.Date with Slick 3.1.0-M1

我是 Slick 的新手。我正在使用 mysql 并且我正在尝试从数据库中检索一些日期时间。这是我的进口商品

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

这里是 class 映射所在的行

def creationDate = column[Date]("creation_date")

但是我收到这个错误

could not find implicit value for parameter tt: slick.ast.TypedType[java.util.Date]

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

谢谢

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

The following primitive types are supported out of the box for JDBC-based databases in JdbcProfile (with certain limitations imposed by the individual database drivers): Date types: 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.

中找到三个与时间相关的 class
DateJdbcType for java.sql.Date
TimestampJdbcType for java.sql.Timestamp
TimeJdbcType for java.sql.Time

此外,定义的类型与文档中所述的一致,三个时间相关类型

我在我的程序中使用 TimestampSlick 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 _)
}

那样的话,您只需将 Timestamp 来回转换为您想要的任何与时间相关的类型,但这应该没什么大不了的。

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

你试过了吗Joda-Time

如果没有,你应该认真考虑一下。并且有一个 slick-mapper 项目 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")

如果您想按原样使用 java.util.Date, 创建映射日期类型到时间戳。

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
)