Результаты HQL-запроса «нельзя использовать в этой общей коллекции» при возврате подкласса - PullRequest
2 голосов
/ 10 марта 2011

Учитывая следующее:

Компания имеет коллекцию объектов Product.
Область имеет коллекцию объектов Product.
Любой данный продукт имеет компанию и район.
SpecialProduct является подклассом продукта.

Я использую следующий запрос HQL в NHibernate.

// return all SpecialProperty objects for a given company and area.
IQuery query = session.CreateQuery("select product from Company as company " +
    "join company.Products as product " +
    "join product.Area as area " +
    "where company.Id = :coId " +
    "and area.Id = :arId " +
    "and product.class = MyNamespace.DomainModel.SpecialProduct ")
    .SetInt64("coId", companyId)
    .SetInt64("arId", areaId);
IList<SpecialProduct> specialProducts = query.List<SpecialProduct>();

Когда 2-й оператор выше выполняет, я получаю сообщение об ошибке:

Не удалось выполнить запрос [SQL: SQL недоступен] Значение «SpecialProduct» не относится к типу «MyNamespace.DomainModel.SpecialProduct» и не может использоваться в этой универсальной коллекции.
Имя параметра: значение

(Обратите внимание, что объект отображается в сообщении выше как «SpecialProduct» из-за переопределения ToString () в классе SpecialProduct.)

Если я изменю инструкцию, чтобы вернуть список суперкласса, Product, вот так ...

IList<Product> products = query.List<Product>();  

... тогда я не получаю ошибку, и в списке возвращается один соответствующий объект. Изучая этот объект в отладчике, я вижу, что это, на самом деле, SpecialProduct в соответствии с переопределением ToString (), но при ближайшем рассмотрении я вижу, что это прокси-класс NHibernate. Если я пытаюсь привести объект к SpecialProduct, произойдет сбой приведения. Хммм ...

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

Мне нужно получить результаты в виде общей коллекции объектов SpecialProperty.

Есть идеи, почему это не работает?

1 Ответ

0 голосов
/ 12 марта 2011

Это по замыслу.Прокси-серверы NH наследуются от базового типа, а не подклассов.

Надеемся, эта ссылка поможет.

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