返回子类时,HQL查询结果“不能在此通用集合中使用”

时间:2011-03-10 16:30:27

标签: nhibernate hql

鉴于以下内容:

公司有一系列产品对象 区域有一组Product对象 任何特定产品都有公司和区域 SpecialProduct是Product的子类。

我在NHibernate中使用以下HQL查询。

// 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>();

当上面的第二个语句执行时,我收到一条错误说明:

无法执行查询[SQL:SQL不可用] 值“SpecialProduct”不是“MyNamespace.DomainModel.SpecialProduct”类型,不能在此通用集合中使用。
参数名称:值

(注意,由于SpecialProduct类中的ToString()覆盖,该对象在上面的消息中显示为“SpecialProduct”。)

如果我更改语句以返回超类的列表,Product,就像这样......

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

...然后我没有收到错误,列表中返回了一个匹配的对象。在调试器中检查这个对象,我看到根据ToString()覆盖,实际上看起来似乎是一个SpecialProduct,但仔细观察我发现它是一个NHibernate代理类。如果我尝试将对象转换为SpecialProduct,则转换失败。嗯......

我还检查了数据库本身并确认该记录已保存为SpecialProduct(基于join-subclass表中存在匹配记录的事实)。

我需要将结果作为SpecialProperty对象的通用集合。

关于为什么这不起作用的任何想法?

1 个答案:

答案 0 :(得分:0)

这是设计的。 NH代理继承自基类型,而不是子类。

希望this link会有所帮助。