Извлечение заказов и количества строк заказа с подзапросами - PullRequest
4 голосов
/ 05 августа 2011

Я в процессе портирования старого приложения на Nhibernate.
Старое приложение широко использует пакеты ORACLE, и я хочу избавиться от этого.
Я начал отображать несколько таблиц, и кажется, что все работаеточень хорошо.
Теперь у меня есть запрос, которым я бы хотел управлять через QueryOver ... или что-то подобное:

SELECT
    Orders.*
    (SELECT COUNT(*) FROM OrderLines
        WHERE OrderLines.CompanyCode = Orders.CompanyCode
              AND OrderLines.OrderNumber = Orders.OrderNumber
              AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0)
              AND OrderLines.Status = 'R') OrderLinesCount
    FROM
        Orders
    WHERE
        AND Orders.CompanyCode = [CompanyCode];

[CompanyCode] это фильтр.

Мне нужно сопоставить файлы (Orders и OrderLines), и моя ассоциация выглядит следующим образом:

<class name="Order" table="Orders">
    ...
    <set name="OrderLines" access="field.pascalcase-underscore" inverse="true" lazy="extra" cascade="none">
      <key>
        <column name="OrderNumber" not-null="true"/>
        <column name="CompanyCode" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found ="ignore"/>
    </set>
</class>

Первичный ключ для моей таблицы Orders - CompanyCode и OrderNumber .

Я хотел бы запросить ордера и получить количество строк для каждого ордера.

Я добился того, чего хочу, добавив свойство формулы (спасибо Айенде за это) в отображение заказа:

<property name="OrderLinesCount" formula="(SELECT COUNT(*) FROM OrderLines WHERE OrderLines.CompanyCode = CompanyCode AND OrderLines.OrderNumber = OrderNumber AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0) AND OrderLines.Status = 'R')" />

, но я боюсь, что мой клиент можетЯ решил однажды изменить эти неприятные фильтры, и я был бы вынужден перекомпилировать весь проект.

Есть ли способ достичь того же результата с помощью подзапроса (QueryOver)?

Заранее спасибоза вашу помощь.

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Может быть не совсем то, что вы ищете, но рассматривали ли вы пункт where в коллекции. Вы можете вызвать order.OrderLinesFiltered.Count, чтобы получить значение

<set name="OrderLinesFiltered" table="OrderLines" 
access="field.pascalcase-underscore" inverse="true" lazy="extra"
cascade="none" 
where=" NOT (OCLSCOM = 'Y' AND OCLSSEQ = 0) AND Status = 'R' ">
  <key>
    <column name="OrderNumber" not-null="true"/>
    <column name="CompanyCode" not-null="true"/>
  </key>
  <one-to-many class="OrderLine" not-found ="ignore"/>
</set> 
0 голосов
/ 23 февраля 2012

В конце я решил перейти к свойству формулы:

<property name="OrderLinesCount" formula="(SELECT COUNT(*) FROM OrderLines WHERE OrderLines.CompanyCode = CompanyCode AND OrderLines.OrderNumber = OrderNumber AND NOT (OrderLines.OCLSCOM = 'Y' AND OrderLines.OCLSSEQ = 0) AND OrderLines.Status = 'R')" />

Однажды, если мне понадобится изменить фильтр, я мог бы подумать об использовании фильтров nHibernate.

...