Joda-Date Mapper for Slick - MappedColumnTyoe

时间:2014-10-17 21:33:10

标签: mysql scala slick

我的问题非常接近这个问题,但我的错误是不同的。

Customer Type Mapper for Slick SQL

这是我的实用程序类,其中定义了JDATE和Mapper

package org.mydomain.utils
import slick.driver.MySQLDriver.simple._
import org.joda.time.DateTime
import java.sql.Date
import org.joda.time.DateTime
import java.sql.Timestamp

sealed trait JDATE

object DateUtils {

  implicit def jdateColumnType  =
      MappedColumnType.base[DateTime, Timestamp](
        dt => new Timestamp(dt.getMillis),
        ts => new DateTime(ts.getTime)
  )
}

域对象User.scala如下

case class UserRow(id: Long, birthday: JDATE)

class User(tag: Tag) extends Table[UserRow](tag, "USER") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def birthday = column[JDATE]("BIRTHDAY")

def * = (id, birthday) <> (UserRow.tupled, UserRow.unapply)
}

错误: 方法列的参数不足:(隐式tm:scala.slick.ast.TypedType [org.mydomain.utils.JDATE])scala.slick.lifted.Column [org.mydomain.utils.JDATE]。未指定的值参数tm。

如何通过这里的?为这个菜鸟问题道歉。感谢

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

  1. 您不需要JDATE - 您实际上并不想在任何地方使用它,您想要的能够在{{1}之间进行翻译}和DateTime个实例。使用Timestamp代替DateTime类型(例如column而不是column[DateTime]("BIRTHDAY")
  2. 您实际上从未导入隐式column[JDATE]("BIRTHDAY")转换器,因此Slick的DateTime <> Timestamp永远不会选择它。之一:

    column

    // Import the implicit in the constructor
    class User(tag: Tag) extends Table[UserRow](tag, "USER") {
      import org.mydomain.utils.DateUtils.jdateColumnType
      // Your code here
    }
    

    或(最佳选项),通过扩展// Explicitly pass the implicit converter in yourself class User(tag: Tag) extends Table[UserRow](tag, "USER") { // ... snip ... def birthday = column[DateTime]("BIRTHDAY")(DateUtils.jdateColumnType) // ... snip ... } 驱动程序并使用自定义隐式字符来创建自己的驱动程序:

    MySql

    然后您可以像这样使用它:

    package org.mydomain.db
    
    import scala.slick.driver.{MySqlDriver, JdbcDriver}
    
    trait DateUtils {
      implicit def jdateColumnType  =
          MappedColumnType.base[DateTime, Timestamp](
            dt => new Timestamp(dt.getMillis),
            ts => new DateTime(ts.getTime)
      )
    }
    
    trait CustomMySqlDriver extends JdbcDriver with MySqlDriver with DateUtils
    
    object CustomMySqlDriver extends CustomMySqlDriver