【问题标题】:squeryl date to long conversionsqueryl 日期到长转换
【发布时间】:2013-01-02 15:44:40
【问题描述】:

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

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

我怎样才能做到这一点?

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

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

  1. 有自定义类型

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

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

感谢任何帮助!

【问题讨论】:

  • 你使用的是哪个版本的 squeryl,0.9.5 还是 0.9.6?
  • 来自 Build.scala 的确切版本:0.9.5-6

标签: scala date utc gmt squeryl


【解决方案1】:

请看这个例子:

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 项目中的示例...

【讨论】:

  • 只是想指出这是基于 Squeryl 0.9.6-SNAPSHOT。 Squeryl 0.9.5 对类型操作不太友好,所以你肯定想升级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 2023-03-14
  • 2016-07-07
  • 1970-01-01
相关资源
最近更新 更多