Nhibernate 子集合中的setfirstresult和setmaxresult

Nhibernate 子集合中的setfirstresult和setmaxresult,nhibernate,hql,criteria-api,Nhibernate,Hql,Criteria Api,我有一个实体,我们称之为实体,还有一个子集合。 我有一个屏幕,其中用户有实体信息,还有一个包含子集合的列表,但该集合可能会变得非常大,因此我考虑使用分页:获取前20个元素,只有当用户明确按下next按钮时,才延迟加载下一个元素 因此,我在实体存储库中创建了一个具有以下签名的函数: IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage) 我需要在子集合中使用se

我有一个实体,我们称之为实体,还有一个子集合。 我有一个屏幕,其中用户有实体信息,还有一个包含子集合的列表,但该集合可能会变得非常大,因此我考虑使用分页:获取前20个元素,只有当用户明确按下next按钮时,才延迟加载下一个元素

因此,我在实体存储库中创建了一个具有以下签名的函数:

IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage)
我需要在子集合中使用setfirstresult和setmaxresult,而不是在Agregate根实体中。但当我使用这两种配置时,它们总是引用HQL/Criteria查询的实体类型

另一种方法是为子类型创建HQL/Criteria查询,设置max和first结果,然后使用子查询筛选实体子集合中的成员。 但我不能做这个过滤器。如果是引用父实体的双向关联子实体,则会更容易

有什么建议吗


任何

一种方法都是创建一个查询,通过执行group by来返回两个表的结果。这种方法将允许您对来自子集合的数据应用分页,并且在每一行中都有一个公共因子,即实体的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>();
        }

缺点是返回的数据是数组列表,您必须将对象强制转换为对象[],但您可以通过使用AliasToBean功能来克服这一点,该功能可以将这些数组投影到您定义的强类型对象。

使用CreateFilter很简单

session.CreateFilter(entity.children, "")
    .SetFirstResult(0)
    .SetMaxResults(20)
    .List();

那么孩子对父母没有FK?只有一个链接表?是的,只有一个链接表