1、Hibernate分页查询小结通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:1、QBE(Qurey By Example)检索方式QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。Java代码1. /*2. *function根据传递过来的Object,分页显示在数据库中与其匹配的记录3. *parampageNo4. *当前页数5
2、. *parampageSize6. *每页显示的记录数7. *paramobject8. *将查询条件封装为Object9. *return将查询结果封装为Pager返回10. */11. publicPagerfindPageByExample(intpageNo,intpageSize,Objectobject)12. 13. Pagerpager=null;14. try15. 16. Criteriacriteria=this.getSession().createCriteria(17. Class.forName(this.getEntity();18. 19. if(objec
3、t!=null)20. 21. criteria.add(Example.create(object).enableLike();22. 23. 24. /获取根据条件分页查询的总行数25. introwCount=(Integer)criteria.setProjection(26. Projections.rowCount().uniqueResult();27. criteria.setProjection(null);28. 29. criteria.setFirstResult(pageNo-1)*pageSize);30. criteria.setMaxResults(pageSi
4、ze);31. 32. Listresult=criteria.list();33. 34. pager=newPager(pageSize,pageNo,rowCount,result);35. 36. catch(RuntimeExceptionre)37. 38. throwre;39. finally40. 41. returnpager;42. 43. 44. 注意代码的第20行,即criteria.add(Example.create(object).enableLike();这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查
5、询。在BO层将需要模糊查询的列用%串起来,不然仍然和=一样。BO层代码:Java代码1. /*2. *function将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录3. *parampageNo4. *当前的页码5. *parampageSize6. *每页显示的记录数7. *parammendName8. *抢修人员的名称9. *paramspecialty10. *抢修人员的工种11. *parampost12. *抢修人员的职称13. *return将符合条件的记录数以及页码信息封装成PagerBean返回14. */15. publicPagergetInfoByQue
6、ry(intpageNo,intpageSize,StringmendName,16. Stringspecialty,Stringpost)17. 18. 19. EicMendeicMend=newEicMend();20. if(mendName!=null&mendName.length()0)21. 22. eicMend.setMendname(%+mendName+%);23. 24. if(specialty!=null&specialty.length()0)25. 26. eicMend.setSpecialty(specialty);27. 28. if(post!=nu
7、ll&post.length()0)29. 30. eicMend.setPost(post);31. 32. 33. Pagerpager=erpManagerDao34. .findPageByExample(pageNo,pageSize,eicMend);35. returnpager;36. 执行SQL语句如下:Sql代码1. Hibernate:selectcount(*)asy0_fromYJZX.EIC_MENDthis_where2. (this_.MENDNAMElike?andthis_.POSTlike?)3. 4. Hibernate:select*from(sele
8、ctthis_.MENDIDasMENDID23_0_,5. this_.EXPERTREMARKasEXPERTR28_23_0_fromYJZX.EIC_MENDthis_where6. (this_.MENDNAMElike?andthis_.POSTlike?)whererownum=?所以只需将需模糊查询的列用“%”链接即可。2、QBC(Qurey By Criteria)检索方式 采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Restrictions接口组成,
9、它支持在运行时动态生成查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用Criterion不定参数传参。Map传参方式范例如下:DAO层:Java代码1. /*2. *function分页显示符合所有的记录数,将查询结果封装为Pager3. *parampageNo4. *当前页数5. *parampageSize6. *每页显示的条数7. *parammap8. *将查询条件封装为map9. *return查询结果Pager10. */11. publicPagerfindPageByCriteria(intpageNo,intpageSize,Mapmap)12. 13.
10、Pagerpager=null;14. try15. 16. Criteriacriteria=this.getSession().createCriteria(17. Class.forName(this.getEntity();18. 19. if(map!=null)20. 21. Setkeys=map.keySet();22. for(Stringkey:keys)23. 24. criteria.add(Restrictions.like(key,map.get(key);25. 26. 27. 28. /获取根据条件分页查询的总行数29. introwCount=(Integer
11、)criteria.setProjection(30. Projections.rowCount().uniqueResult();31. criteria.setProjection(null);32. 33. criteria.setFirstResult(pageNo-1)*pageSize);34. criteria.setMaxResults(pageSize);35. 36. Listresult=criteria.list();37. 38. pager=newPager(pageSize,pageNo,rowCount,result);39. 40. catch(Runtime
12、Exceptionre)41. 42. throwre;43. finally44. 45. returnpager;46. 47. 48. Map传参方式对应BO层代码:Java代码1. /*2. *function将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录3. *parampageNo4. *当前的页码5. *parampageSize6. *每页显示的记录数7. *parammendName8. *抢修人员的名称9. *paramspecialty10. *抢修人员的工种11. *parampost12. *抢修人员的职称13. *return将符合条件的记录数以及页
13、码信息封装成PagerBean返回14. */15. publicPagergetInfoByQuery2(intpageNo,intpageSize,StringmendName,16. Stringspecialty,Stringpost)17. 18. 19. Mapmap=newHashMap();20. 21. if(mendName!=null&mendName.length()0)22. 23. map.put(mendname,%+mendName+%);24. 25. if(specialty!=null&specialty.length()0)26. 27. map.put
14、(specialty,specialty);28. 29. if(post!=null&post.length()0)30. 31. map.put(post,post);32. 33. 34. Pagerpager=erpManagerDao.findPageByCriteria(pageNo,pageSize,map);35. returnpager;36. 第二种方式:Criterion不定参数传参方式。其代码如下所示:DAO层代码:Java代码1. /*2. *function分页显示符合所有的记录数,将查询结果封装为Pager3. *parampageNo4. *当前页数5. *pa
15、rampageSize6. *每页显示的条数7. *paramcriterions8. *不定参数Criterion9. *return查询结果Pager10. */11. publicPagerfindPageByCriteria(intpageNo,intpageSize,12. Criterion.criterions)13. 14. Pagerpager=null;15. try16. 17. Criteriacriteria=this.getSession().createCriteria(18. Class.forName(this.getEntity();19. if(crite
16、rions!=null)20. 21. for(Criterioncriterion:criterions)22. 23. if(criterion!=null)24. 25. criteria.add(criterion);26. 27. 28. 29. 30. 31. /获取根据条件分页查询的总行数32. introwCount=(Integer)criteria.setProjection(33. Projections.rowCount().uniqueResult();34. criteria.setProjection(null);35. 36. criteria.setFirst
17、Result(pageNo-1)*pageSize);37. criteria.setMaxResults(pageSize);38. 39. Listresult=criteria.list();40. 41. pager=newPager(pageSize,pageNo,rowCount,result);42. 43. catch(RuntimeExceptionre)44. 45. throwre;46. finally47. 48. returnpager;49. 50. 51. Criterion不定参数传参方式对应BO层代码:Java代码1. /*2. *function将传递过来
18、的参数封装成抢修人员Bean,分页查询符合条件的记录3. *parampageNo4. *当前的页码5. *parampageSize6. *每页显示的记录数7. *parammendName8. *抢修人员的名称9. *paramspecialty10. *抢修人员的工种11. *parampost12. *抢修人员的职称13. *return将符合条件的记录数以及页码信息封装成PagerBean返回14. */15. publicPagergetInfoByQuery3(intpageNo,intpageSize,StringmendName,16. Stringspecialty,Str
19、ingpost)17. 18. Criterioncriterion1=null,criterion2=null,criterion3=null;19. if(mendName!=null&mendName.length()0)20. 21. criterion1=Restrictions.ilike(mendname,mendName,22. MatchMode.ANYWHERE);23. 24. 25. if(specialty!=null&specialty.length()0)26. 27. criterion2=Restrictions.ilike(specialty,special
20、ty,28. MatchMode.EXACT);29. 30. 31. if(post!=null&post.length()0)32. 33. criterion3=Restrictions.ilike(post,post,MatchMode.EXACT);34. 35. 36. Pagerpager=erpManagerDao.findPageByCriteria(pageNo,pageSize,37. criterion1,criterion2,criterion3);38. 39. returnpager;40. 3、HQL检索方式HQL(Hibernate Query Languag
21、e)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。使用Query接口分页查询DAO代码:Java代码1. /*2. *function分页显示符合所有的记录数,将查询结果封装为Pager3. *parampageNo4. *当前页数5. *parampageSize6. *每页显示的条数7. *paraminstance8. *将查询条件封装为专家Bean9. *return查询结果Pager10. */11. publicListfindPageByQuery(intpageNo,intpageSize,Strin
22、ghql,12. Mapmap)13. 14. Listresult=null;15. try16. 17. Queryquery=this.getSession().createQuery(hql);18. 19. Iteratorit=map.keySet().iterator();20. while(it.hasNext()21. 22. Objectkey=it.next();23. query.setParameter(key.toString(),map.get(key);24. 25. 26. query.setFirstResult(pageNo-1)*pageSize);27. query.setMaxResults(pageSize);28. 29. result=query.list();
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1