Nhibernate - 创建SQLQuery - IndexOutOfRangeException

时间:2010-02-08 10:10:44

标签: c# nhibernate

我们有一个名为Customer的表,它有三个子类/表即。 Cust1,Cust2和Cust3,由hbm使用join-sub-class链接。

所有4个表都将CustomerId作为主键。客户表中的记录将在Cust1或Cust 2或Cust3表中有一条记录。

使用标准Nhibernate List()获取列表正确地获取类及其子类。

但是,为了优化我们的查询,我们不得不使用CreateSQlQuery方法。

在goolging上,我们发现获取类及其子类的正确方法是 有一个选择查询,如

var sqlQuery = Session.CreateSqlQuery(
select C.*,
case if C1.CustId is not null then 1
else if C2.CustId is not null then 2
....
from Customer C
left join Cust1 C1 on C1.CustId = C1.CustId
left join Cust2 C2 on C2.CustId

where C.CustID in (x,y,z,blah,blah).).

sqlQuery.AdddEntity("C",typeof(Customer));

sqlQuery.List();

当Nhibernate在内部生成查询时,需要更改case和alais以区分4个表之间的CUstId列,否则会抛出clazz错误..

在运行查询时,我们得到了Nhibernate Exception as

  

“IndexOutOfRangeException - Duration”

Cust1(子类)表有一个名为Duration的列。我将表列重命名为Duration_BE以检查列名是否为问题, 然后它抛出了错误

  

“IndexOutOfRangeException - Duration-BE”

这种工作方式的参考是...... http://www.methodicmadness.com/2009/01/nhibernate-what-is-heck-clazz.html

任何人都可以帮助我。

1 个答案:

答案 0 :(得分:1)

确保选择所有表中的所有字段。

e.g。

var sqlQuery = Session.CreateSqlQuery(@"
  select 
    C.*, 
    C1.*,
    C2.*, -- You need all of the fields from the joined tables
    case 
      if C1.CustId is not null then 1 
      else if C2.CustId is not null then 2
    end as clazz_
  from 
    Customer C 
    left join Cust1 C1 on C.CustId = C1.CustId
    left join Cust2 C2 on C.CustId = C2.CustId
  where 
    C.CustID in (x,y,z)"
);