2010-06-09 5 views
5

나는이 내 엔터티 모델에 정의 된 다음 엔터티 :HQL 질의

public class MyContainer 
{ 
    public virtual ICollection<Base> Subs { get; set; } 
} 

public abstract class Base 
{ 
    public virtual Guid Id { get; set; } 
} 
public abstract class Sub1 : Base 
{ 
    public virtual int MyValue { get; set; } 
} 
public abstract class Sub2 : Base 
{ 
    public virtual int MyValue { get; set; } 
} 

및 위의 실체에 대해 다음 FluentNHibernate 매핑 :

public sealed class BaseMap : ClassMap<Base> 
{ 
    public BaseMap() 
    { 
     Table("BaseTable"); 
     Id(e => e.Id); 
    } 
} 

public sealed class Sub1Map : SubClassMap<Sub1> 
{ 
    public Sub1Map() 
    { 
     Table("Sub1Table"); 
     KeyColumn("BaseId"); 

     Map(e => e.Myvalue); 
    } 
} 

public sealed class Sub2Map : SubClassMap<Sub2> 
{ 
    public Sub2Map() 
    { 
     Table("Sub2Table"); 
     KeyColumn("BaseId"); 

     Map(e => e.Myvalue); 
    } 
} 

내가 실행 다음 HQL :

select sub 
    from MyContainer container 
     join fetch container.Subs sub 
    where sub.MyValue = :p1 

생성 된 SQL은 하위 클래스 ho Wever에게의, 즉은, 다음과 같은 골격 SQL은 정확한 생성 조인 생성 :

SELECT ... 
FROM BaseTable bt 
    INNER JOIN Sub1Table st1 ON ... 
    INNER JOIN Sub2Table st2 ON ... 
WHERE st1.MyValue = @p1 

을 내가 추가 또는를 기대하고있어 같은 경우 WHERE 절 :

SELECT ... 
FROM BaseTable bt 
    INNER JOIN Sub1Table st1 ON ... 
    INNER JOIN Sub2Table st2 ON ... 
WHERE st1.MyValue = @p1 
     OR st2.MyValue = @p2 

내가 '뭔가 있나요 m 누락, 또는 HQL을 다시 작성하여 WHERE 절의 각 하위 클래스를 참조하고 제약 조건을 직접 적용 할 수 있습니다 (생성 된 SQL에서 추가 제약 조건을 생성한다고 가정).

저는 NHibernate 3.0.0을 사용하고 있습니다.

+0

하는 경우 SubclassMap을 사용하여 매핑을 만드는 대신 오래된 JoinedSubClass() 접근법을 사용합니다. WHERE 절에서 어떤 제약 조건이 나오는 지 순서가 변경됩니다. 나는 이해하지 못한다. –

답변

1

MyValue는 Base에 선언되고 매핑되어야합니다. 특정 클래스에 캐스팅없이 서브 클래스에 정의 된 속성으로 기본 클래스를 필터링 할 수 없습니다 :

편집
where (b.class = Sub1 and b.MyValue = :p1) or (b.class = Sub2 and b.MyValue = :p1) 

: 또는 FNH1.2 조합 서브 클래스에서 사용할 수 있습니다 :

public class BaseMap : ClassMap<Base> 
{ 
    public BaseMap() 
    { 
     UseUnionSubclassForInheritanceMapping(); 
     Table("BaseTable"); 
     Id(e => e.Id); 
    } 
}