11

スリックテストからこの例を見つけました:
https://github.com/slick/slick/blob/master/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/MapperTest.scala

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

しかし、org.joda.time.DateTime と java.sql.Timestamp の間の TypeMapper を作成しようとしていますが、あまり成功していません。Bool の例は非常に特殊で、私はそれを適応させるのに苦労しています。Joda Time は非常に一般的です。

明確にするために、補間された sql"""select colA,colB from tableA where id = ${id}""" などを使用しています。選択を行うとき、暗黙的な GetResult コンバーターで jodaDate 型を使用することにより、システムはうまく機能します。

ただし、挿入の場合、暗黙的な変換を行う方法がないように思われるか、以下の回答 #1 で提供されるコードを無視しています - 前と同じエラー: パラメーター pconv の暗黙的な値が見つかりませんでした: scala.slick.jdbc .SetParameter[(Option[Int], String, String, Option[org.joda.time.DateTime])]

おそらく、注釈付きの Table オブジェクトで Lifted スタイルの Slick 構成を使用していないため、TypeMapper を見つけたり使用したりしていません

4

2 に答える 2

14

私は自分のコードで次のものを使用していますが、これはあなたにも役立つかもしれません:

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

編集(編集後 =^.~= ):(少し遅れましたが、それでも役立つことを願っています)

ああ、わかりました。持ち上げられた埋め込みを使用していないため、別の暗黙的な値を定義する必要があります (コンパイラからのエラー メッセージで示されます)。次のようなものが機能するはずです(ただし、自分で試したことはありません):

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

逆に ( の結果を取得するSELECT) には、次のように定義する必要があるようですGetResult

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

つまり、基本的にこれは持ち上げられた埋め込みと同じで、異なるタイプでエンコードされているだけです。

于 2013-02-11T18:56:19.627 に答える
4

うまく機能するものを掘り下げてみませんか?見る

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

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

最初にプロジェクトにコピーして貼り付けることができ、2 つ目は Maven セントラルから入手できます。

于 2013-06-24T11:51:09.223 に答える