NHibernate使用ICriteria分页并返回数据库记录总条数

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

最近在使用NHibernate,发现进行分页查询无法得到数据库记录的总条数,在网上找了很久没找到具体的实现方法,找到的资料都说得不是很清楚,研究了很久终于写出了这样一个方法。

NHibernate下分页要使用Icriteria约束查询条件,但是返回的只有当前页的记录数,无法返回数据库总记录条数,这样在使用的时候就算不出总页数。自定义一个分页响应对象PageResponse用于返回记录总条数和分页查询结果集。

///<summary>///分页响应对象///</summary>///<typeparam name="T"></typeparam>publicclassPageResponse<T>{publicintTotalCount {get;set; }publicIList<T> ResultList {get;set; }

}

参考网上的方法,先创建一个ICriteria用于查询数据库记录总条数,再clone一个用于分页查询,返回我自己定义的PageResponse对象,包含记录总条数和分页查询结果集。获得数据库记录总数之后要用UniqueResult()将SetPRojection()所附加的条件去掉,注意一定要clone一个Icriteria来分页,否则只用一个Icriteria来完成两次操作会报错。

///<summary>///分页查询///</summary>///<param name="pageSize">每页显示记录条数</param>///<param name="pageNumber">页码</param>///<returns></returns>publicPageResponse<RequestMessage> GetRequestMessageList(intpageNumber,intpageSize)

{using(Isessionsession =sessionFactory.OpenSession())

{

ICriteria criteria= session.CreateCriteria(typeof(RequestMessage));

ICriteria pageCriteria=CriteriaTransformer.Clone(criteria);

PageResponse<RequestMessage> requestMessage =newPageResponse<RequestMessage>();

requestMessage.TotalCount=Convert.ToInt32(criteria.SetProjection(Projections.RowCount()).UniqueResult());

requestMessage.ResultList=pageCriteria

.SetFirstResult(pageSize* (pageNumber <1?0: pageNumber -1))

.SetMaxResults(pageSize)

.List<RequestMessage>();

session.Flush();returnrequestMessage;

}

}

使用这种分页有两个问题

1.使用两个Icriteria来查询两次,不知道性能怎么样(待测试)

2.返回的结果集包含数据库的所有字段,不能直接在前端使用,需要把数据库查出来的结果集转换(DTO)为一个ViewModel集合给前端使用(待实现)

不知道大家还有没有更好的实现方法?

ps:在博客园潜水很久了,第一次写东西,很多东西不会表达,但是还是希望拿出些东西跟大家一起交流。各位大大轻拍!

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航