我的模型基本上就像:
Parent:
{
Id (Guid),
ParentName (String),
Children (Set of Child)
}
Child:
{
Id (Guid),
ParentId (Guid),
ChildName (String)
}
我在实体模式下使用NHibernate并尝试加载子集合而不加载父对象的其他属性。
尝试使用Criteria API:
var criteria = session.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", id))
.SetFetchMode("Children", FetchMode.Eager)
.SetProjection(Projections.Property("Children"));
但似乎预测对集合没有影响,并且它确实生成了无效的SQL查询,导致异常:
NHibernate.Exceptions.GenericADOException未被用户代码
处理 Message =无法执行查询[SELECT this_.Id as y0_ FROM Parent this_ WHERE this_.Id = @ p0]姓名:cp0 - 值:0effb1c4-a98e-4b10-846c-a1a200eecb11 [SQL:SELECT this_.Id as y0_ FROM ManagedObject this_ WHERE this_.Id = @ p0] Source = NHibernate SqlString = SELECT this_.Id as y0_ FROM Parent this_ WHERE this_.Id = @ p0
内部异常
索引超出了数组的范围。
能够使用HQL完成任务:
var q = session.CreateQuery(
"select c from Parent p inner join p.Children c where p.Id = :id")
.SetParameter("id", id);
但我仍然感到困惑 - 有没有办法使用Criteria API直接查询Child表?