2013-02-11 26 views
10

tôi đã tìm thấy ví dụ này từ thử nghiệm trơn:
https://github.com/slick/slick/blob/master/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/MapperTest.scalakhách hàng Loại hình Mapper cho SQL Slick

sealed trait Bool 
case object True extends Bool 
case object False extends Bool 

implicit val boolTypeMapper = MappedColumnType.base[Bool, String](
    { b => 
    assertNotNull(b) 
    if(b == True) "y" else "n" 
    }, { i => 
    assertNotNull(i) 
    if(i == "y") True else False 
    } 
) 

Nhưng tôi đang cố gắng để tạo ra một TypeMapper cho org.joda.time.DateTime đến/từ java .sql.Timestamp - nhưng không có nhiều thành công. Ví dụ Bool rất cụ thể và tôi đang gặp khó khăn trong việc thích ứng với nó. Thời gian Joda là siêu phổ biến - vì vậy mọi trợ giúp sẽ được đánh giá cao.

Để rõ ràng, tôi đang sử dụng dấu "" xen kẽ, chọn colA, colB từ tableA trong đó id = $ {id} "" "và như vậy. Khi thực hiện chọn hệ thống hoạt động tốt bằng cách sử dụng các loại jodaDate trong trình chuyển đổi GetResult ngầm định.

Tuy nhiên, đối với chèn có vẻ không phải là cách để thực hiện chuyển đổi ngầm hoặc bỏ qua mã được cung cấp bên dưới trong Câu trả lời số 1 - lỗi tương tự như trước: không thể tìm thấy giá trị tiềm ẩn cho tham số pconv: scala.slick.jdbc.SetParameter [(Tùy chọn [Int], Chuỗi, Chuỗi, Tùy chọn [org.joda.time.DateTime])]

Tôi không sử dụng cấu hình Nâng kiểu Slick với các đối tượng Bảng được chú thích có lẽ đó là lý do tại sao nó không tìm/sử dụng TypeMapper

Trả lời

13

Tôi sử dụng mã sau trong mã của tôi, cũng có thể phù hợp với bạn:

import java.sql.Timestamp 
import org.joda.time.DateTime 
import org.joda.time.DateTimeZone.UTC 
import scala.slick.lifted.MappedTypeMapper.base 
import scala.slick.lifted.TypeMapper 

implicit val DateTimeMapper: TypeMapper[DateTime] = 
    base[DateTime, Timestamp](
    d => new Timestamp(d millis), 
    t => new DateTime(t getTime, UTC)) 

Chỉnh sửa (sau khi chỉnh sửa của bạn =^~ =.): (hơi muộn nhưng tôi hy vọng nó vẫn giúp)

Ah, OK, vì bạn đang không sử dụng nâng nhúng, bạn sẽ phải xác định các giá trị ngầm khác nhau (như được chỉ ra bởi thông báo lỗi từ trình biên dịch). Giống như sau nên làm việc (mặc dù tôi đã không cố gắng bản thân mình):

implicit val SetDateTime: SetParameter[DateTime] = new SetParameter { 
    def apply(d: DateTime, p: PositionedParameters): Unit = 
    p setTimestamp (new Timestamp(d millis)) 
} 

Đối với chiều ngược lại (lấy kết quả của SELECT), có vẻ như bạn cần phải xác định một GetResult:

implicit val GetDateTime: GetResult[DateTime] = new GetResult { 
    def apply(r: PositionedResult) = new DateTime(r.nextTimestamp getTime, UTC)) 
} 

Vì vậy, về cơ bản, điều này cũng giống như với việc nhúng nâng lên, chỉ được mã hóa với các loại khác nhau.

+1

Cảm ơn bạn vì ví dụ đó, tôi đã sử dụng MappedTypeMapped và nó gây ra lỗi, nhưng ví dụ đó với định nghĩa loại rõ ràng cho chuyển đổi hoạt động như là sự quyến rũ. –

4

Tại sao không để digg vào một cái gì đó hoạt động tuyệt vời? Nhìn vào

https://gist.github.com/dragisak/4756344

https://github.com/tototoshi/slick-joda-mapper

Trước tiên, bạn có thể sao chép-dán để dự án của bạn, và thứ hai là có sẵn từ Maven trung ương.

+0

Tôi đang cố gắng sử dụng (1) nhưng "MappedColumnType" def birthday = column [JDATE] ("BIRTHDAY") Tôi nhận được lỗi sau. Không đủ đối số cho cột phương thức (implicit tm: scala.slick.ast.TypedType [JDATE]) scala.slick.lifted.Column [JDATE]. Tham số giá trị không xác định tm. Nhưng tôi chuyển "tm" ở đâu? – Andy

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