我和实体可以将其称为Entity
,以及Child
集合Children
。
我有一个用户拥有Entity
信息的屏幕,以及一个带有Children
集合的列表,但该集合可能变得非常大,所以我在考虑使用分页:获取前20个元素,如果用户明确按下下一个按钮,则延迟加载下一个按钮。
所以我在Entity Repository中创建了一个带有此签名的函数:
IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage)
我需要使用setfirstresult和setmaxresult,而不是在Agregate根实体中,而是在子集合中。但是当我使用这两个配置时,它们总是引用HQL / Criteria查询的实体类型。
其他替代方法是为Child
类型创建HQL / Criteria查询,设置max和first结果,然后过滤Entity Children集合中的那些(通过使用子查询)。
但我无法做这个过滤器。如果它是双向关联(Child引用父实体),那将更容易。
有什么建议吗?
任何
答案 0 :(得分:0)
一种方法是创建一个查询,通过执行分组来返回两个表的结果。这种方法允许您对来自子集合的数据应用分页,并在保留起始点(实体对象)时具有公共因子(每行中的实体ID)。我的意思是这样的:
public IList<object> GetData(int entityID, int actualPage, int numberOfRecordsPerPage)
{
ICriteria criteria = _repository.Session.CreateCriteria<FlowWhatIfProfile>("entity")
.CreateCriteria("Children", "children", NHibernate.SqlCommand.JoinType.InnerJoin)
.Add(Restrictions.Eq("children.EntityID", entityID));
ProjectionList pl = Projections.ProjectionList();
pl.Add(Projections.GroupProperty("children.Id"));
pl.Add(Projections.GroupProperty("children.Property1"));
pl.Add(Projections.GroupProperty("children.Property2"));
pl.Add(Projections.GroupProperty("children.Property2"));
pl.Add(Projections.GroupProperty("entity.Id"));
return criteria.SetProjection(pl)
.SetFirstResult(actualPage * numberOfRecordsPerPage)
.SetFetchSize(numberOfRecordsPerPage)
.List<object>();
}
缺点是您返回的数据是一个数组列表(您必须将object
强制转换为object[]
)但是您可以通过使用AliasToBean功能来解决这个问题,以免NHibernate项目这些数组到您定义的强类型对象。
答案 1 :(得分:0)
使用CreateFilter
很简单session.CreateFilter(entity.children, "")
.SetFirstResult(0)
.SetMaxResults(20)
.List();
http://knol.google.com/k/fabio-maulo/nhibernate-chapter-16/1nr4enxv3dpeq/19#