我想使用Squeryl将java.util.Date(或Timestamp)存储为我的数据库中的int(或Long)。
我想控制日期如何转换为数字,反之亦然。
我怎样才能做到这一点?
我对scala / squeryl很新,来自java / hibernate。 回到java / hibernate,我可以创建用户类型,并将它们注册为globaly,或者在带有注释的字段上使用它们。此用户类型定义了如何将对象类型持久保存到db以及如何从db加载它的方法。
我读了一些squeryl和scala文档,注意到两件事:
有自定义类型
有一个为转换调用的隐式函数机制
我知道其中一个可以帮助我,但我没有找到任何好的完整例子来理解如何。
任何帮助表示赞赏!
答案 0 :(得分:2)
请看这个例子:
在你的情况下,你为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项目中的例子......