我正在尝试将现有的应用程序从SQueryl 0.9.5迁移到0.9.6,以便使用新的extended field types。我现在已经到了应用程序及其测试编译的程度,但是一旦我尝试加载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)
看一下source似乎异常来自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
< / p>
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)
}
答案 0 :(得分:1)
更正回答:
您正在导入org.squeryl.PrimitiveTypeMode随播对象 以及您自己的扩展(对象DateTime扩展PrimitiveTypeMode)
您只能在同一个应用程序中使用on或其他应用程序(请参阅http://squeryl.org/0.9.6.html)
现在不推荐使用org.squeryl.PrimitiveTypeMode配对对象(不具有相同名称的特征)
旧(错)回答:
您不需要注册自定义类型,该寄存器仅适用于原始JDBC类型,它是一个封闭集。
请参阅此示例:https://github.com/max-l/squeryl-extended-field-types-example JodaDate由(已注册的)Timestamp原语类型支持。