setfirstresult&儿童集合中的setmaxresult

时间:2010-03-17 17:56:57

标签: nhibernate hql criteria-api

我和实体可以将其称为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引用父实体),那将更容易。

有什么建议吗?

任何

2 个答案:

答案 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#