2010-08-11 3 views
0

개체 목록을 반환하기 위해 HQL로 엔티티를 쿼리하려고합니다. 쿼리는 정확한 행 수를 반환하지만 첫 번째 항목 (즉, 반환 된 첫 번째 행은 모든 항목에 걸쳐 복제됩니다). 이 문제의 원인은 무엇일까요?중복을 반환하는 엔티티 목록에 대한 NHibernate HQL 조인 쿼리

HQL 쿼리는

using (ISession session = NHibernateHelper.OpenSession()) 
    { 

    var query = session.CreateQuery(@" 
    select facts from Fact as facts 
    inner join facts.FactorDimension as facDim 
    inner join facts.MarketDimension as markDim 
    inner join facDim.TargetDimension as tarDim where 
    markDim.MarketID = :marketId 
    and tarDim.TargetID = :targetId 
    and facts.ReportYear = :untilReportYear 
    and facts.ReportMonth <= :untilReportMonth 
    and facts.ReportMonth >= 1 
    "); 

     query.SetString("targetId", targetId.ToString()); 
     query.SetString("marketId", marketId.ToString()); 
     query.SetString("untilReportMonth", untilPeriod.Month.ToString()); 
     query.SetString("untilReportYear", untilPeriod.Year.ToString()); 

    return query.List<Fact>(); 
    } 

하고 매핑 파일

<class name="Fact" table="Fact"> 

     <composite-id> 
     <key-many-to-one name="MarketDimension" column="MarketID" 
class="MarketDimension"/> 
     <key-many-to-one name="FactorDimension" column="FactorID" class="FactorDimension"/>  
     </composite-id> 

     <property name="ReportMonth" /> 
     <property name="ReportYear" /> 

    </class> 

감사합니다.

답변

0

다음을 수행하여 문제를 해결할 수있었습니다.

테이블에 기본 키로 사용되는 복합 키가 있는데, 복합 키를 제거하고 단일 기본 키 열을 추가했습니다. 이 새로운 매핑으로 인해 쿼리에서 올바른 엔터티가 반환됩니다.

이유에 대한 설명이 있으면 누구나 의견을 추가하십시오. 감사.

<class name="Fact" table="Fact"> 

     <id name="FactID"> 
     <generator class="guid"/> 
     </id> 

     <many-to-one name="MarketDimension" column="MarketID" class="MarketDimension"/> 
     <many-to-one name="FactorDimension" column="FactorID" class="FactorDimension"/>  


     <property name="ReportMonth" /> 
     <property name="ReportYear" /> 

    </class> 
1

쿼리에 Transformer : DistinctRootEntityTransformer가 사용되도록 지정하십시오.

query.SetResultTransformer(Transformers.DistinctRootEntity);