2014-10-17 249 views
0

我的問題非常接近這個問題,但我的錯誤是不同的。Joda-Date Mapper for Slick - MappedColumnTyoe

Customer Type Mapper for Slick SQL

這是JDATE和映射定義

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.util s.JDATE。未指定的值參數tm。

如何在這裏傳遞tm?對於這個noob問題抱歉。由於

回答

1

有兩個問題在這裏:

  1. 你不需要JDATE - 你實際上並不想在任何地方使用它,你的是要能夠DateTimeTimestamp之間進行轉換實例。使用DateTimecolumn類型,而不是(例如column[DateTime]("BIRTHDAY")而非column[JDATE]("BIRTHDAY")
  2. 你從來沒有真正導入您的隱含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 
    

    ,你可以然後像這樣使用它:

    import org.mydomain.db.CustomMySqlDriver.simple._ 
    
    class User(tag: Tag) extends Table[UserRow](tag, "USER") { 
        // ... snip ... 
        def birthday = column[DateTime]("BIRTHDAY") 
        // ... snip ... 
    } 
    
+0

感謝您的回覆。我選擇了擴展MySQL驅動程序。我不認爲我的用戶對象出於某種原因正在查看映射。 [錯誤] /Users/andy/git2/src/main/scala/org/mydomain/model/User.scala:105:無法找到參數tm的隱式值:scala.slick.ast.TypedType [org.joda。 time.DateTime] [error] def birthday = column [DateTime](「BIRTHDAY」) – Andy 2014-10-18 04:34:53