开发者

Inheritance: Criterion on entity type and sub class properties

开发者 https://www.devze.com 2022-12-14 19:27 出处:网络
I have a inheritance hierarchy which I have mapped in NHibernate using Table-per-class. My mappping file looks like the one below (lots of properties omitted).

I have a inheritance hierarchy which I have mapped in NHibernate using Table-per-class. My mappping file looks like the one below (lots of properties omitted).

To query this hierarchy, I am building a dynamic DetachedCriteria for Message based on filter input from the user. Messages (of any type in the hierarchy) should be returned to the user in one list.

  1. I would like to build a criteria based on the type of message, ie. the user could specify to get all messages of type SMSMessage or EmailMessage with a ReceivedDate > '2009-01-01'. How would I go about to do that?
  2. In the same query, the user could specify that if the Message is an InternalMessage, it should have Priority = 2. How would I specify such type-specific predicates?

All this is possible to do in LINQ, so I am hoping I can do it in NHibernate as well.

<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">
    开发者_C百科<property name="BodyPlainText" />
    ...
  </subclass>
  <subclass name="InternalMessage" discriminator-value="4">
    <property name="Priority" />
    ...
  </subclass>
</class>


I kind of figured this out myself, but in the end I ended up reverting to pure SQL since I hit too many roadblocks with HQL/Criterias. Anyways, I can share how I did this.

  1. Maybe not pretty, but I solved it by adding the discriminator column as a regular property to the top level class in the hierarchy (Message) and employed restrictions against that column.

  2. It turns out that you can specify restrictions against properties for subclasses even in the top-level query, so this was easier than I thought. It was just a matter of specifying the restrictions.

0

精彩评论

暂无评论...
验证码 换一张
取 消