2015-09-07 9 views
5

私はSlick 3.1.0-M2を使用しています。私のテーブルでjava.time.LocalDateとjava.time.LocalTimeを使用したいと思います。私はこのようにそれを行う:Slickでjava.time.LocalDateのカスタム列マッピングを作成する

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 
) 
} 

は、だから私は3つの暗黙的なマッピングを持っていますが、最初のものだけがコンパイルされます。私は最初のマッピングはファイルJdbcTypesComponent.scalaでTimestampJdbcTypeを見つけることがわかりますIntelliJので暗黙のパラメータ検査を行うと

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

:java.sql.Dateとをjava.sql.Time持つものがでコンパイルを失敗します。そのすぐ隣に、TimeJdbcTypeとDateJdbcTypeがあります。だから、最初のものはどうして見つかるのですか?他のものはどうですか?

答えて

6

あなたはslick.driver.JdbcTypesComponentをチェックすると、あなたはtrait ImplicitColumnTypesを含む、列タイプのための暗黙の多くが含まれています:

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

あなたが実際にを定義し、後者二つは同じ名前を持っているがデフォルトのもの。

インポート時に名前を変更するか、名前を変更するとデフォルトの名前が変更されます。

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

ああ、私はこれまでにこのエラーを見つけたとは思わないので、BIGに感謝します! :) –

関連する問題