使用Slick/Scala将日期和时间存储到MySQL中

使用Slick/Scala将日期和时间存储到MySQL中,mysql,scala,date,slick,Mysql,Scala,Date,Slick,我有一个看似简单的问题,希望有一个简单的解决方案。但是我还没有找到它 MySQL中的属性类型为DATE和TIMESTAMP。 以下是我的课程: case class Event ( id: Long, name: String, category: String, date: Date, venue: String, startTime: Date, endTime: Date, description: String, admission: String, addInfo: Option[

我有一个看似简单的问题,希望有一个简单的解决方案。但是我还没有找到它

MySQL中的属性类型为DATE和TIMESTAMP。 以下是我的课程:

case class Event (
  id: Long, name: String, category: String, date: Date, venue: String, startTime: Date, endTime: Date, description: String, admission: String, addInfo: Option[String])

class Events(tag: Tag) extends Table[Event](tag, "EVENT") {

  implicit val dateColumnType = MappedColumnType.base[Date, Long](d => d.getTime, d => new Date(d))

  def id = column[Long]("ID", O.PrimaryKey)
  def name = column[String]("NAME")
  def category = column[String]("CATEGORY")
  def date = column[Date]("DATE")
  def venue = column[String]("VENUE")
  def startTime = column[Timestamp]("START_TIME")
  def endTime = column[Timestamp]("END_TIME")
  def description = column[String]("DESCRIPTION")
  def admission = column[String]("ADMISSION")
  def addInfo = column[String]("ADD_INFO")

  def * = (id, name, category, date, venue, startTime, endTime, description, admission, addInfo.?) <> (Event.tupled, Event.unapply _)
}
案例类事件(
id:Long,name:String,category:String,date:date,vention:String,startTime:date,endTime:date,description:String,admission:String,addInfo:Option[String])
类事件(标记:标记)扩展表[事件](标记,“事件”){
隐式val-dateColumnType=MappedColumnType.base[Date,Long](d=>d.getTime,d=>new Date(d))
def id=列[Long](“id”,O.PrimaryKey)
def名称=列[字符串](“名称”)
定义类别=列[字符串](“类别”)
定义日期=列[日期](“日期”)
def场馆=列[字符串](“场馆”)
def startTime=列[时间戳](“开始时间”)
def endTime=列[时间戳](“结束时间”)
def description=列[字符串](“说明”)
def acmission=列[String](“acmission”)
def addInfo=列[字符串](“添加信息”)
def*=(id、名称、类别、日期、地点、开始时间、结束时间、描述、入场、附加信息?)(Event.tuple、Event.unapply 41;
}
由于某种原因,我不能让它工作。主要问题似乎是如何在MySQL中将java.util.Date存储为日期和时间戳类型


有人能建议如何最好地做到这一点吗??我对Scala/Slick的世界还相当陌生。

你退房了吗?您可能还希望签出Joda周围更友好的Scala包装:

您希望在MySQL中将java.util.Date存储为日期和时间戳类型,因此您需要定义转换:

1) java.util.Date=>java.sql.Date

2) java.util.Date=>java.sql.Timestamp

class Events(tag: Tag) extends Table[Event](tag, "EVENT") {
   def id = column[Long]("ID", O.PrimaryKey)
   def name = column[String]("NAME")
   def category = column[String]("CATEGORY")
   def date = column[Date]("DATE")(DateMapper.utilDate2SqlDate)
   def venue = column[String]("VENUE")
   def startTime = column[Date]("START_TIME") (DateMapper.utilDate2SqlTimestampMapper)
   def endTime = column[Date]("END_TIME")(DateMapper.utilDate2SqlTimestampMapper)
   def description = column[String]("DESCRIPTION")
   def admission = column[String]("ADMISSION")
   def addInfo = column[Option[String]]("ADD_INFO")

   def * = (id, name, category, date, venue, startTime, endTime, description, admission, addInfo) <> (Event.tupled, Event.unapply)
}



object DateMapper {

    val utilDate2SqlTimestampMapper = MappedColumnType.base[java.util.Date, java.sql.Timestamp](
{ utilDate => new java.sql.Timestamp(utilDate.getTime()) },
{ sqlTimestamp => new java.util.Date(sqlTimestamp.getTime()) })

   val utilDate2SqlDate = MappedColumnType.base[java.util.Date, java.sql.Date](
{ utilDate => new java.sql.Date(utilDate.getTime()) },
{ sqlDate => new java.util.Date(sqlDate.getTime()) })

}
class事件(tag:tag)扩展表[Event](tag,“Event”){
def id=列[Long](“id”,O.PrimaryKey)
def名称=列[字符串](“名称”)
定义类别=列[字符串](“类别”)
def date=列[date](“date”)(DateMapper.utilDate2SqlDate)
def场馆=列[字符串](“场馆”)
def startTime=列[Date](“开始时间”)(DateMapper.utildate2sqltimestamper)
def endTime=列[Date](“END_TIME”)(DateMapper.utildate2sqltimestamper)
def description=列[字符串](“说明”)
def acmission=列[String](“acmission”)
def addInfo=列[选项[字符串]](“添加信息”)
def*=(id、名称、类别、日期、地点、开始时间、结束时间、描述、入场、附加信息)(Event.tuple、Event.unapply)
}
对象日期映射器{
val utildate2sqltimestamper=MappedColumnType.base[java.util.Date,java.sql.Timestamp](
{utilDate=>new java.sql.Timestamp(utilDate.getTime())},
{sqlTimestamp=>newjava.util.Date(sqlTimestamp.getTime())}
val utilDate2SqlDate=MappedColumnType.base[java.util.Date,java.sql.Date](
{utilDate=>new java.sql.Date(utilDate.getTime())},
{sqlDate=>newjava.util.Date(sqlDate.getTime())}
}

谢谢天空,第一次尝试就成功了!这个转换是隐式的吗?@Raaj否,因为有两个转换具有相同的输入类型参数(java.util.Date),所以compile不知道哪一个使用java.util.Date=>java.sql.Date或java.util.Date=>java.sql.Timestamp。@我建议在数据库中始终保存时间戳而不是日期。若你们在保存日期,那个就意味着你们只损失了小时和分钟,秒。同意。我在一开始就把它作为时间戳,但是我真的只需要事件日期,因为时间是在startTime和endTime中捕获的。这个解决方案适用于Slick 3.x吗?我开始研究Joda time,但认为有一个简单的方法。我一定会尽快调查的。非常感谢。