2015-09-07 14 views
5

Używam Slick 3.1.0-M2 i chcę używać java.time.LocalDate i java.time.LocalTime w moich tabelach. Robię to tak:Utwórz niestandardowe mapowanie kolumn dla java.time.LocalDate ze Slickem

import java.sql.{Date, Time, Timestamp} 
import java.time.{LocalDate, LocalTime, LocalDateTime, ZoneOffset} 

trait DateTimeColumns { 

    import slick.driver.PostgresDriver.api._ 

    implicit val localDateTimeColumnType = MappedColumnType.base[LocalDateTime, Timestamp](
    d => Timestamp.from(d.toInstant(ZoneOffset.ofHours(0))), 
    d => d.toLocalDateTime 
) 

    implicit val dateColumnType = MappedColumnType.base[LocalDate, Date](
    d => Date.valueOf(d), 
    d => d.toLocalDate 
) 

    implicit val timeColumnType = MappedColumnType.base[LocalTime, Time](
    localTime => Time.valueOf(localTime), 
    time => time.toLocalTime 
) 
} 

Mam 3 niejawne mapowania, ale tylko pierwsza kompiluje. Te z java.sql.Date i java.sql.Time nie kompilację z:

could not find implicit value for evidence parameter of type slick.driver.PostgresDriver.BaseColumnType[java.sql.Date] 

Kiedy zrobić niejawny kontrolę parametrów w IntelliJ widzę, że pierwszy mapowanie znajdzie TimestampJdbcType w pliku JdbcTypesComponent.scala . Zaraz obok widzę TimeJdbcType i DateJdbcType. Jak to się stało, że pierwszy został znaleziony, ale inni nie?

Odpowiedz

6

Jeśli zaznaczysz slick.driver.JdbcTypesComponent, znajdziecie trait ImplicitColumnTypes zawiera wiele implicits dla typu kolumny, w tym:

implicit def timeColumnType = columnTypes.timeJdbcType 
implicit def dateColumnType = columnTypes.dateJdbcType 

Dwa ostatnie zdefiniowano faktycznie mieć taką samą nazwę z domyślne.

Zmiana nazwy lub zmiana nazwy domyślnej podczas importowania działa dla mnie.

import slick.driver.PostgresDriver.api._ 
import slick.driver.PostgresDriver.api.{ timeColumnType => DefaultTimeColumnType } 

implicit val myDateColumnType = MappedColumnType.base[LocalDate, Date](
    ld => Date.valueOf(ld), 
    d => d.toLocalDate 
) 

implicit val timeColumnType = MappedColumnType.base[LocalTime, Time](
    localTime => Time.valueOf(localTime), 
    time => time.toLocalTime 
) 
+1

Ahh, nie sądzę, żebym kiedykolwiek znalazł ten błąd, więc WIELKIE, dziękuję! :) –

Powiązane problemy