// 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>该映射适用于使用请求的Grant属性的所有其他内容。(我在Grant.hbm.xml中添加了映射,以尝试解决此问题。)
如果我使用下面的第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>();发布于 2009-08-03 05:33:56
您应该像这样使用别名:
return session
.CreateCriteria(typeof (Request),"req")
.CreateCriteria("req.Grant","gr") 然后
.Add(Restrictions.Eq("req.Status", "Draft"))或
.Add(Restrictions.Eq("gr.Status", "Draft"))取决于属性所在的位置。
https://stackoverflow.com/questions/1218858
复制相似问题