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

问题描述:

我有我在NHibernate的使用表的每类映射到的继承层次结构判据。我的映射文件看起来像下面的文件(大量属性省略)。继承:上实体类型和子类的属性

查询这个层次,我基于从用户输入过滤器建立一个动态的DetachedCriteria消息。消息(层次结构中的任何类型)应该在一个列表中返回给用户。

  1. 我想建立一个基于消息类型的标准,即。用户可以指定获取类型为的所有消息SMSMessageEmailMessageReceivedDate>'2009-01-01'。我会怎么做呢?
  2. 在相同的查询中,用户可以指定如果消息是InternalMessage,它应该有优先级 = 2.我该如何指定这种类型特定的谓词?

所有这些都可以在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> 

我有点想通了这一点我自己,但最终我最终恢复到纯SQL,因为我击中HQL /规定 - 太多的障碍。无论如何,我可以分享我是如何做到这一点的。

  1. 也许不是很漂亮,但我加鉴别列作为一个普通的属性到顶层类层次结构中的(消息)和使用的限制,针对该列解决它。

  2. 事实证明,你可以指定为对抗甚至在*查询子类性质的限制,所以这是比我想象的更容易。这只是一个明确限制的问题。