2010-08-11 3 views
0

J'essaye de demander des entités avec HQL afin de retourner une liste d'objets. La requête renvoie le nombre correct de lignes, mais la première entrée (c'est-à-dire que la première ligne renvoyée est dupliquée sur toutes les entités). Quelle pourrait être la cause de ce problème?NHibernate HQL rejoindre la requête pour la liste des entités retournant des doublons

La requête HQL est

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>(); 
    } 

et le fichier de mappage est

<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> 

Merci.

Répondre

0

J'ai réussi à résoudre ce problème en procédant comme suit.

Une clé composite est utilisée dans la table en tant que clé primaire, j'ai supprimé la clé composite et ajouté une seule colonne de clé primaire. Ce nouveau mappage génère les entités correctes renvoyées à partir de la requête.

Si quelqu'un a des explications sur la raison pour laquelle ce serait le cas, veuillez ajouter quelques commentaires. Merci.

<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

Indiquez que la requête doit utiliser un Transformer: DistinctRootEntityTransformer.

query.SetResultTransformer(Transformers.DistinctRootEntity); 
Questions connexes