加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala – 客户类型Mapper for Slick SQL

发布时间:2020-12-16 19:00:10 所属栏目:安全 来源:网络整理
导读:我发现这个例子从光滑的测试: https://github.com/slick/slick/blob/master/slick-testkit/src/main/scala/com/typesafe/slick/testkit/tests/MapperTest.scala sealed trait Boolcase object True extends Boolcase object False extends Boolimplicit val
我发现这个例子从光滑的测试:
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
  }
)

但是我试图为java.sql.Timestamp中的org.joda.time.DateTime创建一个TypeMapper,但没有太多的成功. Bool的例子是非常特别的,我遇到麻烦适应它. Joda时间是超级常见 – 所以任何帮助将不胜感激.

要清楚,我使用插值sql“”“从tableA中选择colA,colB,其中id = ${id}”“”等等.在选择系统时,通过在隐式GetResult转换器中使用jodaDate类型,系统运行良好.

然而,对于插入来说,似乎没有办法进行隐式转换,或者忽略了Answer#1中提供的代码 – 与以前一样的错误:
找不到参数pconv的隐式值:scala.slick.jdbc.SetParameter [(Option [Int],String,Option [org.joda.time.DateTime])]

我没有使用带有注释表对象的Lifted Style Slick配置,也许这??就是为什么没有找到/使用TypeMapper

解决方法

我在我的代码中使用以下内容,这也可能适用于您:

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

所以,基本上这是一样的提升嵌入,只是编码与不同的类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读