2015-09-07 19 views
5

Tôi đang sử dụng Slick 3.1.0-M2 và tôi muốn sử dụng java.time.LocalDate và java.time.LocalTime trong các bảng của tôi. Tôi làm như sau:Tạo ánh xạ cột tùy chỉnh cho java.time.LocalDate với Slick

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

Vì vậy, tôi có 3 ánh xạ ngầm nhưng chỉ biên dịch đầu tiên. Những người với java.sql.Date và java.sql.Time không biên soạn với:

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

Khi tôi làm một kiểm tra tham số ẩn trong IntelliJ Tôi có thể thấy rằng các bản đồ đầu tiên tìm thấy TimestampJdbcType trong file JdbcTypesComponent.scala . Ngay bên cạnh đó tôi thấy TimeJdbcType và DateJdbcType. Vì vậy, làm thế nào đến đầu tiên được tìm thấy nhưng những người khác không?

Trả lời

6

Nếu bạn đánh dấu vào slick.driver.JdbcTypesComponent, bạn sẽ tìm thấy một trait ImplicitColumnTypes chứa rất nhiều implicits cho loại cột, bao gồm:

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

Sau đó hai bạn đã định nghĩa thực sự có cùng tên với mặc định.

Thay đổi tên của chúng hoặc đổi tên tên mặc định khi nhập sẽ hoạt động cho tôi.

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, tôi không nghĩ rằng mình có thể đã tìm thấy lỗi này, vì vậy BIG cảm ơn bạn! :) –

Các vấn đề liên quan