squeryl日期到长期转换

时间:2013-01-18 20:41:16

标签: scala date utc gmt squeryl

我想使用Squeryl将java.util.Date(或Timestamp)存储为我的数据库中的int(或Long)。

我想控制日期如何转换为数字,反之亦然。

我怎样才能做到这一点?

我对scala / squeryl很新,来自java / hibernate。 回到java / hibernate,我可以创建用户类型,并将它们注册为globaly,或者在带有注释的字段上使用它们。此用户类型定义了如何将对象类型持久保存到db以及如何从db加载它的方法。

我读了一些squeryl和scala文档,注意到两件事:

  1. 有自定义类型

  2. 有一个为转换调用的隐式函数机制

  3. 我知道其中一个可以帮助我,但我没有找到任何好的完整例子来理解如何。

    任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

请看这个例子:

https://github.com/max-l/squeryl-extended-field-types-example/blob/master/src/main/scala/example/MyCustomTypes.scala

在你的情况下,你为TLong(支持JDBC类型)和DateTime for Date替换TTimestamp(你可能想考虑使用joda日期)。

implicit val dateAsLongTEF = new NonPrimitiveJdbcMapper[Long, Date, TLong](longTEF, this) {
  def convertFromJdbc(v: Long) = new Date(v)
  def convertToJdbc(v: Date) = v.getTime
}

implicit val optionDateAsLongTEF = 
new TypedExpressionFactory[Option[Date], TOptionLong] 
  with DeOptionizer[Long, Date, TLong, Option[Date], TOptionLong]  {

    val deOptionizer = dateAsLongTEF
}

注意:您使用TLong和TOptionLong意味着您将能够这样做 将数字列与DSL中的长支持列进行比较。

更新:有一个限制阻止重新注册基本类型, 所以你需要一个包装器类型,我更新了github项目中的例子......