2016-02-17 4 views
2

Je suis nouveau sur Slick et j'ai du mal à obtenir le mapping de java.sql.date/time/timestamp mappé en jodatime.Types de colonnes de mappage Slick 3.1.1

trait ColumnTypeMappings { 

    val profile: JdbcProfile 
    import profile.api._ 

    val localTimeFormatter = DateTimeFormat.forPattern("HH:mm:ss") 
    val javaTimeFormatter = new SimpleDateFormat("HH:mm:ss") 

    implicit val myDateColumnType = MappedColumnType.base[LocalDate, Date](
    ld => new  java.sql.Date(ld.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis), 
    d => new LocalDateTime(d.getTime).toLocalDate 
) 

    implicit val myTimeColumnType = MappedColumnType.base[LocalTime, Time](
    lt => new java.sql.Time(javaTimeFormatter.parse(lt.toString(localTimeFormatter)).getTime), 
    t => new LocalTime(t.getTime) 
) 

    implicit val myTimestampColumnType = MappedColumnType.base[DateTime, Timestamp](
    dt => new java.sql.Timestamp(dt.getMillis), 
    ts => new DateTime(ts.getTime, DateTimeZone.UTC) 
) 

} 

Dans l'auto généré Tables.scala I sur le mapping comme ceci:

trait Tables extends ColumnTypeMappings { 
    val profile: slick.driver.JdbcDriver 
    import profile.api._ 
    import scala.language.implicitConversions 
    // + rest of the auto generated code by slick codegen 
} 

Et pour envelopper le tout-je utiliser cela comme ceci:

object TestTables extends Tables { 
    val profile = slick.driver.MySQLDriver 
} 

import Tables._ 
import profile.api._ 

val db = Database.forURL("url", "user", "password", driver = "com.mysql.jdbc.Driver") 
val q = Company.filter(_.companyid === 1).map(._name) 
val action = q.result 
val future = db.run(action) 
val result = Await.result(future, Duration.Inf) 

Je reçois un NullPointerException on: implicite val myDateColumnType .... lors de l'exécution de ceci. J'ai vérifié que ce dernier bloc de code fonctionne si je supprime le mappage.

+0

Bonjour, je ne l'ai pas essayer ur code, mais si u ont beaucoup de jodatime usages, u peux essayer slick pg, https://github.com/tminglei/slick-pg. Il fournit, jodatime et d'autres mapppings de type populaire. –

Répondre

0

Donc, je pense le problème peut être que vous étendez ColumnTypeMappings dans votre Tables.scala. La documentation ne précise pas mais je pense que le code généré automatiquement relatif à la base de données ne doit pas être touché, car Slick utilise cette fonction pour mapper les lignes dans la base de données, puis étendre TestTables by ColumnTypeMappings pour effectuer la conversion implicite vous obtenez le résultat de la base de données.

Je n'ai pas encore vraiment plongé dans le slick 3.x mais je me trompe peut-être, mais je pense que cela a du sens.

Edit: Non, je me trompais :(Toutes mes excuses

+0

Avez-vous définitivement importé java.sql.Date ou LocalDateTime? Ceux-ci devront être dans la portée de la conversion implicite –

4

Essayez de changer implicit val-implicit def dans vos définitions de la MappedColumnTypes La raison pour laquelle est liée à la réponse donnée par Maksym Chernenko à ce question En général, le JdbcProfile... conducteur (qui définit api.MappedColumnType) n'a pas été injecté encore et:.

qui provoque NPE Vous pouvez faire votre « Mapper » vallazy, ou changer de val à def (comme indiqué ci-dessous)

implicit def myDateColumnType = MappedColumnType.base[LocalDate, Date](
    ld => new java.sql.Date(ld.toDateTimeAtStartOfDay(DateTimeZone.UTC).getMillis), 
    d => new LocalDateTime(d.getTime).toLocalDate 
) 

implicit def myTimeColumnType = MappedColumnType.base[LocalTime, Time](
    lt => new java.sql.Time(javaTimeFormatter.parse(lt.toString(localTimeFormatter)).getTime), 
    t => new LocalTime(t.getTime) 
) 

implicit def myTimestampColumnType = MappedColumnType.base[DateTime, Timestamp](
    dt => new java.sql.Timestamp(dt.getMillis), 
    ts => new DateTime(ts.getTime, DateTimeZone.UTC) 
)