2010-02-08 5 views
2

우리는 세 개의 하위 클래스/테이블이있는 Customer라는 테이블을 가지고 있습니다. Cust1, Cust2 및 Cust3는 조인 된 하위 클래스를 사용하여 hbm에 의해 링크됩니다.Nhibernate - SQLQuery 생성 - IndexOutOfRangeException

모든 4 개의 테이블에는 CustomerId가 기본 키로 있습니다. 고객 테이블의 레코드에는 Cust1 또는 Cust 2 또는 Cust3 테이블에 하나의 레코드가 있습니다.

표준 Nhibernate List()를 사용하여 목록을 가져 오는 것은 클래스와 하위 클래스를 올바르게 페치합니다.

그러나 쿼리를 최적화하려면 CreateSQlQuery 메서드를 사용해야했습니다.

는 goolging에, 우리는 사건과 alais 변화 사이의 CUstId 열을 차별화 할 필요가 같은

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에가 내부적으로 다른 clazz에에 오류가 발생 될 쿼리를 genereates 4 개 테이블 ..

, 우리는

로 NHibernate에 예외를 얻을 0

"IndexOutOfRangeException - 기간"

Cust1 (하위 클래스) 테이블에는 Duration이라는 열이 있습니다. 내가 열 이름이 문제가 있는지 확인하는 Duration_BE에 테이블 열 이름을 변경, 다음은

가 오류가 발생했습니다 "IndexOutOfRangeException이 - 시간이-BE"

작업이 모드에 대한 참조 .. http://www.methodicmadness.com/2009/01/nhibernate-what-is-heck-clazz.html

어느 누구도 나를 도와 줄 수 있습니까?

+0

이 질문은 매우 구체적이며 NHibernate 사용자 그룹에 대신 게시해야합니다. http://groups.google.com/group/nhusers – zvolkov

답변

1

모든 테이블의 모든 입력란을 선택했는지 확인하십시오.

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)" 
); 
관련 문제