Наследование: критерий типа сущности и свойств подкласса - PullRequest
2 голосов
/ 22 декабря 2009

У меня есть иерархия наследования, которую я отобразил в NHibernate, используя Table-per-class. Мой файл сопоставления выглядит так, как показано ниже (многие свойства опущены).

Чтобы запросить эту иерархию, я создаю динамический DetachedCriteria для Сообщение на основе входных данных фильтра от пользователя. Сообщения (любого типа в иерархии) должны быть возвращены пользователю в одном списке.

  1. Я хотел бы построить критерии, основанные на типе сообщения, т.е. пользователь может указать, чтобы получать все сообщения типа SMSMessage или EmailMessage с ReceivedDate > '2009-01-01'. Как мне это сделать?
  2. В том же запросе пользователь может указать, что если сообщение является InternalMessage , оно должно иметь Priority = 2. Как я могу указать такие предикаты, специфичные для типа? 1022 *

Все это возможно сделать в 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 Ответ

2 голосов
/ 26 декабря 2009

Я как-то понял это сам, но в итоге я вернулся к чистому SQL, так как с помощью HQL / Criterias преодолел слишком много препятствий. В любом случае, я могу поделиться, как я это сделал.

  1. Возможно, это не очень красиво, но я решил эту проблему, добавив столбец дискриминатора как обычное свойство к классу верхнего уровня в иерархии (Message) и применив ограничения к этому столбцу.

  2. Оказывается, вы можете указать ограничения для свойств для подклассов даже в запросе верхнего уровня, так что это было проще, чем я думал. Это был просто вопрос определения ограничений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...