NHibernate количество элементов в сопоставлении XML - PullRequest
1 голос
/ 08 ноября 2010

Есть ли способ в NHibernate отобразить результат запроса подсчета на свойство класса?Я хотел бы сделать это в сопоставлении XML.

Я знаю, что мог бы сформулировать это с помощью кода (либо с помощью конструкции, которая фактически запрашивает счет, либо путем обмана, выполняя полный запрос и подсчитывая полученный результат).элементы), но было бы неплохо, если бы я мог как-то написать короткий SQL или HQL и вставить его в свое отображение XML.

Конкретный пример.В моей БД есть эти таблицы -

Entry
  Id
  BodySummary

Comment
  Id
  EntryId
  Body

Я хочу получить сводку записей.Для каждой записи я хочу получить количество комментариев (и сводку тела).

К вашему сведению: я опустил нерелевантные части моей БД, такие как авторы, заголовок / тело записи, метки времени и т. Д.конечно, не должно иметь отношения к части запроса, о которой я спрашиваю.

1 Ответ

6 голосов
/ 09 ноября 2010

Я не думаю, что вы можете сделать это с HQL. Но вот как это сделать с помощью SQL:

<class name="Entry" .... >
  <id>
    //ID Strategy
  </id>
  <property name="BodySummary" />
  ...
  <property name="CommentCount" formula="(SELECT COUNT(*) FROM Comment c WHERE c.EntryId = Id)" type="Int32" />
</class>

Важно отметить:

  1. Обернуть sql в круглые скобки - будет ошибка, если он не обернут
  2. Это не HQL - вы должны использовать имена столбцов / таблиц базы данных, а не ваши сопоставленные классы / свойства
  3. Укажите тип возврата, чтобы NHibernate знал, как отобразить его обратно в свойство

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

Результирующий SQL будет выглядеть примерно так:

SELECT          this_.Id                as Id11_0_,
                this_.BodySummary       as BodySummary10_11_0_,
                (SELECT COUNT(* )
                 FROM   Comment c
                 WHERE c.EntryId = this_.Id) as formula0_0_
FROM     Entry this_
...