我有一个继承层次结构,我使用Table-per-class在NHibernate中映射。我的mappping文件如下所示(省略了很多属性)。
要查询此层次结构,我将根据用户的过滤器输入为消息构建动态 DetachedCriteria 。消息(层次结构中的任何类型)应该在一个列表中返回给用户。
这一切都可以在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>
答案 0 :(得分:2)
我有点自己想出来了,但最后我最终恢复到纯SQL,因为我用HQL / Criterias打了太多障碍。无论如何,我可以分享我是如何做到的。
也许并不漂亮,但我通过将层次结构列作为常规属性添加到层次结构中的顶级类(Message)并对该列使用了限制来解决它。
事实证明,即使在顶级查询中,您也可以为子类的属性指定限制,因此这比我想象的要容易。这只是指定限制的问题。