1

新しい拡張フィールド タイプを利用するために、既存のアプリケーションを SQueryl 0.9.5 から 0.9.6 に移行しようとしています。アプリケーションとそのテストがコンパイルされるところまで来ましたが、Schema.

かなり長いスタック トレースの一部には、次のものが含まれます。

[error] ModelSpec.withDB(ModelSpec.scala:14)
[error] BucketSpec$$anonfun$1$$anonfun$apply$1.apply(BucketSpec.scala:11)
[error] BucketSpec$$anonfun$1$$anonfun$apply$1.apply(BucketSpec.scala:11)
[error] Usupported native type models.fields.DateTime,models.fields.DateTime
[error] class java.util.UUID -> java.util.UUID --> null
[error] class java.lang.String -> java.lang.String --> null
[error] class scala.Enumeration$Value -> scala.Enumeration.Val --> null
[error] class [B -> byte[] --> null
[error] class java.lang.Float -> java.lang.Float --> null
[error] class java.util.Date -> java.util.Date --> null
[error] class scala.Enumeration$Val -> scala.Enumeration.Val --> null
[error] class java.lang.Integer -> java.lang.Integer --> null
[error] class java.lang.Double -> java.lang.Double --> null
[error] class java.sql.Timestamp -> java.sql.Timestamp --> null
[error] class java.lang.Byte -> java.lang.Byte --> null
[error] class java.lang.Boolean -> java.lang.Boolean --> null
[error] class scala.math.BigDecimal -> scala.math.BigDecimal --> null
[error] class java.lang.Long -> java.lang.Long --> null
[error] org.squeryl.internals.Utils$.throwError(Utils.scala:95)
[error] org.squeryl.internals.FieldMapper$$anonfun$get$1.apply(FieldMapper.scala:299)
[error] org.squeryl.internals.FieldMapper$$anonfun$get$1.apply(FieldMapper.scala:299)

ソースを見ると、例外はFieldMapper.lookupメソッドの失敗、つまり次の行に起因しているようです

if(!c.isPrimitive)
  registry.get(c)

私が理解している限り、クラスのマッピングはregisterメソッドを介してロードされ、特にネイティブ型の場合、次の行があります

  protected def initialize {
    import PrimitiveTypeSupport._

    register(byteTEF)
    register(intTEF)
    register(longTEF)
    register(floatTEF)
    register(doubleTEF)
    register(bigDecimalTEF)

    register(binaryTEF)
    register(booleanTEF)
    register(stringTEF)
    register(timestampTEF)
    register(dateTEF)
    register(uuidTEF)

個人用の拡張プリミティブ型をこのレジストリにロードして、それらが正しく使用されるようにする方法がわかりません。

拡張プリミティブ型を有効にするメカニズムを知っている人はいますか?

編集:

これが私のモデルです - 「公式」の例のように見えますが、Joda 時間を直接使用しているのではなく、その周りに薄いラッパーが呼び出されているという事実を除けばDateTime

object DateTime extends PrimitiveTypeMode {
  import org.squeryl._
  import org.squeryl.dsl._

  implicit val timeTEF = new NonPrimitiveJdbcMapper[Long, DateTime, TLong](longTEF, this) {
    def convertFromJdbc(t: Long) = DateTime(t)
    def convertToJdbc(t: DateTime) = t.timestamp
  }

  implicit val optionTimeTEF =
    new TypedExpressionFactory[Option[DateTime], TOptionLong]
      with DeOptionizer[Long, DateTime, TLong, Option[DateTime], TOptionLong] {

    val deOptionizer = timeTEF
  }

  implicit def timeToTE(s: DateTime) = timeTEF.create(s)

  implicit def optionTimeToTE(s: Option[DateTime]) = optionTimeTEF.create(s)
}
4

1 に答える 1

1

正解:

org.squeryl.PrimitiveTypeMode コンパニオン オブジェクトと独自の拡張機能をインポートしています (オブジェクト DateTime は PrimitiveTypeMode を拡張します)。

同じアプリケーション内でのみ on または other を使用できます ( http://squeryl.org/0.9.6.htmlを参照)

org.squeryl.PrimitiveTypeMode コンパニオン オブジェクトは廃止されました (同じ名前の特性は廃止されません)。

古い(間違った)答え:

カスタム型を登録する必要はありません。登録はプリミティブ JDBC 型専用であり、クローズド セットです。

この例を参照してください: https://github.com/max-l/squeryl-extended-field-types-example JodaDate は (既に登録されている) Timestamp プリミティブ型によって支えられています。

于 2012-12-19T14:05:18.093 に答える