0

Squeryl を使用して、java.util.Date (またはタイムスタンプ) を int (または Long) としてデータベースに格納したいと考えています。

日付を数値に、またはその逆に変換する方法を制御したいと思います。

どうすればこれを達成できますか?

私は、java/hibernate から来て、scala/squeryl にかなり慣れていません。Java/hibernate に戻って、ユーザー タイプを作成し、それらをグローバルに登録するか、アノテーション付きのフィールドでローカルに使用することができました。このユーザー タイプは、オブジェクト タイプをデータベースに永続化する方法と、データベースからオブジェクト タイプをロードする方法を定義します。

squeryl と scala のドキュメントをいくつか読んだところ、次の 2 つのことに気付きました。

  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 に答える