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),看起来您需要定义 a 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

首先你可以复制粘贴到你的项目中,第二个可以从 Maven 中心获得。

于 2013-06-24T11:51:09.223 回答