继承:实体类型和子类属性的标准

时间:2009-12-22 08:31:28

标签: nhibernate

我有一个继承层次结构,我使用Table-per-class在NHibernate中映射。我的mappping文件如下所示(省略了很多属性)。

要查询此层次结构,我将根据用户的过滤器输入为消息构建动态 DetachedCriteria 。消息(层次结构中的任何类型)应该在一个列表中返回给用户。

  1. 我想根据消息类型建立一个标准,即。用户可以指定使用 ReceivedDate >获取 SMSMessage EmailMessage 类型的所有邮件'2009-01-01'。我将如何做到这一点?
  2. 在同一查询中,用户可以指定如果消息是 InternalMessage ,则应该优先级 = 2.我如何指定此类特定于谓词的谓词?
  3. 这一切都可以在LINQ中完成,所以我希望我也能在NHibernate中做到这一点。

    <class name="Message" table="Message" abstract="true" discriminator-value="null">
      <id name="MessageId">
        <generator class="identity" />
      </id>
      <discriminator column="Type" type="byte" />
      <property name="ParentId" />
      <property name="ReceivedDate" />
        ...
      <subclass name="SMSMessage" discriminator-value="0">
        <property name="Text" column="Text" />
        ...
      </subclass>
      <subclass name="MMSMessage" discriminator-value="1">
        <property name="Subject" />
        ...
      </subclass>
      <subclass name="EmailMessage" discriminator-value="2">
        <property name="BodyPlainText" />
        ...
      </subclass>
      <subclass name="InternalMessage" discriminator-value="4">
        <property name="Priority" />
        ...
      </subclass>
    </class>
    

1 个答案:

答案 0 :(得分:2)

我有点自己想出来了,但最后我最终恢复到纯SQL,因为我用HQL / Criterias打了太多障碍。无论如何,我可以分享我是如何做到的。

  1. 也许并不漂亮,但我通过将层次结构列作为常规属性添加到层次结构中的顶级类(Message)并对该列使用了限制来解决它。

  2. 事实证明,即使在顶级查询中,您也可以为子类的属性指定限制,因此这比我想象的要容易。这只是指定限制的问题。