NHibernate - исключить подкласс, используя критерии с присоединенным подклассом - PullRequest
1 голос
/ 08 июня 2011

В моем приложении свободная конфигурация nhibernate. Запуск последних из обоих. Я пытаюсь создать оператор критериев для возврата определенного класса в объединенной иерархии подклассов. Это пример моей структуры наследования:

Администратор - это Сотрудник - это Персона

Я пытаюсь получить сотрудников, а не администраторов, но поскольку администраторы являются сотрудниками, они возвращаются в запросе. У меня нет колонки дискриминатора для использования. Есть ли способ сделать это, используя Criteria API?

Заранее спасибо.

Схема по запросу (только пример):

Таблица персон: Id, Имя

Таблица сотрудников: PersonId, EmployeeNumber

Администратор: PersonId, AdminNumber

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

1 Ответ

0 голосов
/ 08 июня 2011

Похоже, что Критерии не поддерживают эту функцию. Мне удалось решить эту проблему, добавив ограничение SQL к запросу, чтобы отфильтровать результаты подкласса.

criteria.Add(
    Expression.SQL("{alias}.MyPrimaryKey NOT IN (SELECT MyPrimaryKey FROM Admin)"));

Это, по сути, исключает и вытекает из SQL-запроса Employee, в котором этот Employee существует в таблице Admin, поэтому возвращаются только сотрудники, которые не являются администраторами.

Первоначально я пытался отдельно запросить таблицу Admin через Criteria, чтобы получить список идентификаторов, которые я затем ввел в запрос Employee с помощью оператора NOT IN Criteria Restrictions.Not(Restrictions.In()), но SQL Server ограничивает количество параметров до 2100 и взрывается, если эта коллекция идентификаторов, которую вы пытаетесь исключить, содержит более 2100 элементов.

...