2014-10-17 2 views
0

Моя проблема очень близка к этому вопросу, но моя ошибка отличается.Joda-Date Mapper для Slick - MappedColumnTyoe

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.util s.JDATE]. Неопределенный параметр значения tm.

Как проехать здесь? Извинения за этот вопрос. Благодаря

ответ

1

Есть две проблемы:

  1. Вам не нужно JDATE - вы на самом деле не хотите использовать его в любом месте, что вы хотите , чтобы иметь возможность переводить между DateTime и Timestamp экземпляров. Используйте DateTime для column типа вместо (е. Г. column[DateTime]("BIRTHDAY"), а не column[JDATE]("BIRTHDAY"))
  2. Вы никогда не импортировать неявное DateTime <> Timestamp конвертер, поэтому он никогда не подобран Slick-х 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 Driver. Я не думаю, что мой объект User видит отображение по какой-то причине. [error] /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

Смежные вопросы