0

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

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

我怎样才能做到这一点?

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

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

  1. 有自定义类型

  2. 有一个隐式函数机制被调用来进行转换

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

任何帮助表示赞赏!

4

1 回答 1

2

请看这个例子:

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

在您的情况下,您将 TTimestamp 替换为 TLong (支持 JDBC 类型),将 DateTime 替换为 Date (尽管您可能需要考虑使用 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 项目中的示例......

于 2013-01-22T17:32:41.930 回答