1

我有和实体让我们称之为它Entity,和一个Child集合Children。我有一个用户拥有Entity信息的屏幕和一个包含集合的列表Children,但是该集合可能会变得非常大,所以我正在考虑使用分页:获取前 20 个元素,只有在用户使用时才延迟加载下一个明确按下下一个按钮。

所以我在实体存储库中创建了一个带有这个签名的函数:

IEnumerable<Child> GetChildren(Entity entity, int actualPage, int numberOfRecordsPerPage)

我需要使用 setfirstresult 和 setmaxresult,而不是在聚合根实体中,而是在子集合中。但是当我使用这两种配置时,它们总是引用 HQL/Criteria 查询的实体类型。

其他替代方法是为该Child类型创建一个 HQL/Criteria 查询,设置最大值和第一个结果,然后过滤实体子集合中的那些(通过使用子查询)。但我无法做这个过滤器。如果它是双向关联(子引用父实体)会更容易。

有什么建议么?

任何

4

2 回答 2

0

一种方法是创建一个查询,通过 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>();
        }

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

于 2010-03-17T18:26:59.487 回答
0

CreateFilter 很简单

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

http://knol.google.com/k/fabio-maulo/nhibernate-chapter-16/1nr4enxv3dpeq/19#

于 2010-03-20T01:46:47.890 回答