使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?

Posted

技术标签:

【中文标题】使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?【英文标题】:WIth Squeryl (using Lift), how can I make two model classes a subclass of the same class? 【发布时间】:2015-05-07 13:32:53 【问题描述】:

在 Squeryl 中使用 Lift,我怎样才能使两个类成为同一个类的子类?

我的课程如下所示:

class SubClass1 extends Record[SubClass1] with KeyedRecord[SubClass1] with CreatedUpdated[SubClass1] 

    val id = ...
    val field1a = StringField(...)
    ...



class SubClass2 extends Record[SubClass2] with KeyedRecord[SubClass2] with CreatedUpdated[SubClass2] 

    val id = ...
    val field2a = StringField(...)


我希望 SubClass1SubClass2 分别成为其他类的子类,例如 MyParentClass。所以我认为我必须做这样的事情:

abstract class MyParentClass extends Record[MyParentClass] with KeyedRecord[MyParentClass] with CreatedUpdated[MyParentClass]  

然后

class SubClass1 extends MyParentClass 

    val id = ...
    val field1a = StringField(...)
    ...


class SubClass2 extends MyParentClass 

    val id = ...
    val field2a = StringField(...)
    ...

这给了我错误,例如字段 (StringField) 等不符合正确的类型。有关如何执行此操作的任何建议?

谢谢,

【问题讨论】:

【参考方案1】:

你的抽象超类不能定义一个具体的类型参数,因为它需要被子类覆盖。试试:

abstract class MyParentClass[A <: MyParentClass] 
  extends Record[A] with KeyedRecord[A] with CreatedUpdated[A]

然后:

class SubClass extends MyParentClass[SubClass]

【讨论】:

您好戴夫,非常感谢您的回复。我最终选择了一个与您的解决方案非常相似的解决方案:trait MyParentClass[A &lt;: Record[A]] extends Record[A] with KeyedRecord[A] with CreatedUpdated[A] self: A =&gt; class MySubClass extends MyParentClass[MySubClass] ...

以上是关于使用 Squeryl(使用 Lift),如何使两个模型类成为同一类的子类?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 Squeryl 与 Play 一起工作!框架?

尝试使用 Squeryl 插入时出现 ClassCastException

Scala 反射和 Squeryl

squeryl - 将 bigDecimal 保存到数据库

在 Squeryl 中使用聚合连接多个表

包含greaterThanEqual(gte)或lessThanEqual(lte)的Squeryl查询给出错误/无结果