2009-08-02 178 views
0
// Request.hbm.xml 
    <many-to-one name="Grant" class="Grant" column="GrantId" lazy="false"/> 

    // Grant.hbm.xml 
    <set name="requests" table="Request" generic="true"> 
     <key column="GrantId" /> 
     <one-to-many class="Request"/> 
    </set> 

該映射適用於使用Request的Grant屬性的其他所有內容。 (我在Grant.hbm.xml中添加了映射以嘗試解決此問題。)nHibernate映射/查詢問題

如果我使用下面的第1行,NH無法在Grant(true)上找到Status屬性。如果我使用第2行,NH無法在請求中找到Grant.PO屬性(同樣如此)。我怎樣才能讓NH看起來在正確的地方?

public IList<Request> GetAllActionRequired(string userName) 
    { 
     ISession session = GetSession(); 

     return session 
      .CreateCriteria(typeof (Request)) 
      //.CreateCriteria("Grant") #1 
      //.SetFetchMode("Grant", FetchMode.Eager) #2a 
      //.SetFetchMode("Grant", FetchMode.Join) #2b 
      .Add(Restrictions.Disjunction() 
       .Add(Restrictions.Conjunction() 
        .Add(Restrictions.Eq("Status", "Draft")) 
        .Add(Restrictions.Eq("Requestor", userName))) 
       .Add(Restrictions.Conjunction() 
        .Add(Restrictions.Eq("Status", "Submitted")) 
        .Add(Restrictions.Eq("Grant.PO", userName))) 
       ...) 
      .List<Request>(); 
    } 

查詢的工作原理是,如果我註釋出在Grant表中看到的連詞,所以我只是沒有得到我想要的連接。

編輯,這工作,謝謝!

return session 
    .CreateCriteria(typeof (Request), "r") 
    .CreateCriteria("Grant", "g") 
    .Add(Restrictions.Disjunction() 
     .Add(Restrictions.Conjunction() 
      .Add(Restrictions.Eq("r.Status", "Draft")) 
      .Add(Restrictions.Eq("r.Requestor", userName))) 
     .Add(Restrictions.Conjunction() 
      .Add(Restrictions.Eq("r.Status", "Submitted")) 
      .Add(Restrictions.Eq("g.PO", userName))) 
     ...) 
     .List<Request>(); 

回答

2

你應該使用別名,像這樣:

return session 
     .CreateCriteria(typeof (Request),"req") 
     .CreateCriteria("req.Grant","gr") 

然後

.Add(Restrictions.Eq("req.Status", "Draft")) 

.Add(Restrictions.Eq("gr.Status", "Draft")) 

取決於特性在哪裏。