NHibernate HQL连接查询返回重复项的实体列表

时间:2010-08-11 14:04:26

标签: c# nhibernate nhibernate-mapping

我正在尝试使用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>

感谢。

2 个答案:

答案 0 :(得分:1)

指定查询应使用Transformer:DistinctRootEntityTransformer。

query.SetResultTransformer(Transformers.DistinctRootEntity);

答案 1 :(得分: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>