// 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中添加了映射以尝试解决此问题。)
如果我使用下面的第1行,NH无法在Grant(true)上找到Status属性。如果我使用第2行,NH无法在Request上找到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>();
答案 0 :(得分:2)
你应该使用这样的别名:
return session
.CreateCriteria(typeof (Request),"req")
.CreateCriteria("req.Grant","gr")
然后
.Add(Restrictions.Eq("req.Status", "Draft"))
或
.Add(Restrictions.Eq("gr.Status", "Draft"))
取决于属性的位置。