Реализация сложного запроса в NHibernate? - PullRequest
0 голосов
/ 16 ноября 2010

Я уже некоторое время пользуюсь NHibernate, но в основном для генерации модели автоматического сохранения, основанной на соглашениях, а затем выполняю базовые операции CRUD над объектами.

Теперь у меня есть необходимость выполнить довольно неприятный запрос к унаследованной системе вместе с набором параметров (большая часть предложения where должна быть параметризована). Мне не ясно, нужно ли мне определять отдельные объекты, а затем пытаться реализовать сложный запрос ИЛИ просто использовать собственный SQL для определения запроса. Я также не ясно, правильный синтаксис для определения запроса в файле hbm.xml. Собственный SQL-запрос выглядит следующим образом. Спасибо всем, кто может помочь мне разобраться с этим.

WITH CTE AS ( SELECT
    substr(KEY1||KEY2||KEY3||'-'||digits(KEY4)||'-'||digits(KEY5),1,17) KEY_ID,
    SUM(CASE WHEN BATCH between 200801001 and 200812999 THEN TRANSACTION_AMOUNT ELSE 0 END) AS _2008AMOUNT,
    SUM(CASE WHEN BATCH between 200901001 and 200912999 THEN TRANSACTION_AMOUNT ELSE 0 END) AS _2009AMOUNT,
    SUM(CASE WHEN BATCH between 201001001 and 201012999 THEN TRANSACTION_AMOUNT ELSE 0 END) AS _2010AMOUNT

    FROM _SCHEMA.TRANSACTIONS

    WHERE OWNER='02'
    AND TRANSACTION_TYPE in ('A','B')
    AND BATCH between 200801000 AND 201012999

    GROUP BY KEY1, KEY2, KEY3, KEY4, KEY5

    HAVING SUM(CASE WHEN BATCH between 200801001 and 200812999 THEN TRANSACTION_AMOUNT ELSE 0 END)  0
    OR SUM(CASE WHEN BATCH between 200901001 and 200912999 THEN TRANSACTION_AMOUNT ELSE 0 END)  0
    OR SUM(CASE WHEN BATCH between 201001001 and 201012999 THEN TRANSACTION_AMOUNT ELSE 0 END)  0
    )


    SELECT
    B.OWNER
    ,CTE1.MAX_ITEM_AMOUNT
    ,CTE1.SUM_ITEM_AMOUNT
    ,B.PRIMARY_SECONDARY_IDENTITY
    ,B.PRIMARY_ID
    ,B.PRIMARY_NAME
    ,B.KEY_ID
    ,B.KEY_AMOUNT
    ,CASE(B.KEYCLASS) WHEN 'C' THEN 'CLASS1' WHEN 'S' THEN 'CLASS2' WHEN 'M' THEN 'CLASS3' WHEN 'F' THEN 'CLASS4' END AS KEYCLASS
    ,NA.PRIMARY_CT AS PRIMARY_CITY
    ,NA.PRIMARY_ST AS PRIMARY_STATE
    ,B.KEY_EFFECTIVE_DATE
    ,B.KEY_ENTRY_DATE
    ,CTE._2008AMOUNT
    ,CTE._2009AMOUNT
    ,CTE._2010AMOUNT
    ,B.EMPLOYEE_NAME

    FROM CTE

    JOIN _SCHEMA.TABLE2 B ON CTE.KEY_ID = B.KEY_ID

    JOIN (
    SELECT
    PRIMARY_SECONDARY_IDENTITY
    , MAX(ITEM_AMOUNT) AS MAX_ITEM_AMOUNT
    , SUM(ITEM_AMOUNT) AS SUM_TTEM_AMOUNT
    FROM CTE
    JOIN _SCHEMA.TABLE2 B ON CTE.KEY_ID = B.KEY_ID
    GROUP BY PRIMARY_SECONDARY_IDENTITY
    ) CTE1 ON CTE1.PRIMARY_SECONDARY_IDENTITY = B.PRIMARY_SECONDARY_IDENTITY

    JOIN _SCHEMA.TABLE3 NA ON B.PRIMARY_ID = NA.KEY1 || DIGITS(NA.KEY2)

    ORDER BY MAX_ITEM_AMOUNT DESC, PRIMARY_SECONDARY_IDENTITY
    

1 Ответ

5 голосов
/ 16 ноября 2010

Этот тип транзакции должен обрабатываться через именованные запросы.

NHibernate допускает некоторые предварительно сконфигурированные именованные запросы, которые не может выполнить простая операция CRUD.Я рекомендую вам обратить внимание на их использование в документации NHibernate.

15.2. Named SQL queries

С другой стороны, вас могут заинтересовать нативные запросы SQL.

9.3.5. Queries in native SQL

...