我们有一个名为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
任何人都可以帮助我。
答案 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)"
);