2015-07-10 1 views
3

У меня есть то, что кажется простой проблемой, и желаю, чтобы было простое решение. Но я еще не нашел его.Хранение даты и времени в MySQL с использованием Slick/Scala

Мои атрибуты в 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 _) 
} 

По некоторым причинам, я не могу получить эту работу. Основная проблема заключается в том, как хранить java.util.Date в типах DATE и TIMESTAMP в MySQL.

Может ли кто-нибудь посоветовать, как лучше всего это сделать? Я довольно новичок в мире Scala/Slick.

ответ

6

Вы хотите сохранить java.util.Date в обоих DATE и TIMESTAMP типов в MySQL, так что вы должны определить для преобразования:

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

} 
+0

Спасибо, Sky, работал в первую очередь! Может ли это преобразование быть неявным? –

+0

@Raaj no, потому что есть два преобразования, которые имеют один и тот же параметр входного типа (java.util.Date), поэтому компиляция не понимает, какой из них использует java.util.Date => java.sql.Date или java.util.Date = > java.sql.Timestamp. – Sky

+0

@Raaj Я хотел бы предложить в базе данных всегда сохранять временную метку вместо даты. Если вы сохраняете дату, значит, вы просто потеряли час и минуту, секунду. – Sky

0

Вы проверили slick-joda-wrapper? Вы также можете оформить более Scala дружественную обертку вокруг Joda тоже: https://github.com/nscala-time/nscala-time

+0

Я начал искать в Joda время, но думал, что может быть просто путь. Я обязательно посмотрю в nscala-время. Спасибо! –