Scala – 客户类型Mapper for Slick SQL
我发现这个例子从光滑的测试:
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中提供的代码 – 与以前一样的错误: 我没有使用带有注释表对象的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)) } 所以,基本上这是一样的提升嵌入,只是编码与不同的类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |