query.setFirstResult(pageStartRow); query.setMaxResults(pageSize);
最近开始学Hibernate就写了一个分页的功能,很实用,实现了跳转到相应的页:GO,和用户可选的页面显示数据的数量,与大家分享下,如果有不正确的地方请大家多多指出。谢谢,就不多说废话了.....
首先我们准备一个 Pager.java
view plaincopy to clipboardprint? 01.package com.rao.entitys; 02.
03.import java.util.concurrent.CountDownLatch; 04. 05.
06.public class Pager {
07. private int currentPage; //当前页 08. private int totalRows; //总行数
09. private int pageSartRow; //每页开始的数据行 10. private int totalpages; //总页数
11. private int pageSize; //每页 显示的数据行数量 12.
13. public int getCurrentPage() { 14. return currentPage; 15. } 16.
17. public void setCurrentPage(int currentPage) { 18. this.currentPage = currentPage; 19. } 20.
21. public int getTotalRows() { 22. return totalRows; 23. } 24.
25. public void setTotalRows(int totalRows) { 26. this.totalRows = totalRows; 27. } 28.
29. public int getPageSartRow() { 30. return pageSartRow; 31. }
32.
33. public void setPageSartRow(int pageSartRow) { 34. this.pageSartRow = pageSartRow; 35. } 36.
37. public int getTotalpages() { 38. return totalpages; 39. } 40.
41. public void setTotalpages(int totalpages) { 42. this.totalpages = totalpages; 43. } 44.
45. public int getPageSize() { 46. return pageSize; 47. } 48.
49. public void setPageSize(int pageSize) { 50. this.pageSize = pageSize; 51. } 52. /*
53. * 构造方法,初始化数据 54. */
55. public Pager(int totals,int size){ 56. this.totalRows = totals; 57. this.pageSize = size; 58. //计算总页数,
59. if (totalRows%pageSize!=0) {
60. this.totalpages = totalRows/pageSize+1; 61. }else {
62. this.totalpages = totalRows/pageSize; 63. }
. //默认当前页为第一页 65. this.currentPage = 1; 66. //默认数据的开始为0 67. this.pageSartRow = 0; 68. } 69. /**
70. * 上一页 71. */
72. public void previousPage(){
73. //如果当前页小于等于1,返回 74. if (currentPage<=1) { 75. return;
76. }
77. //当前页减一页 78. currentPage--;
79. //设置每页开始的数据行
80. pageSartRow = (currentPage-1)*pageSize; 81. } 82. /**
83. * 下一页 84. */
85. public void nextPage(){
86. //如果当前页大于总页数,设置当前页为最后一页 87. if (currentPage>=totalpages) { 88. currentPage=totalpages; . }else {
90. //否则当前页加一页 91. currentPage++; 92. }
93. pageSartRow = (currentPage-1)*pageSize; 94. } 95. /**
96. * 首页 97. */
98. public void firsPage(){ 99. currentPage=1;
100. pageSartRow = (currentPage-1)*pageSize; 101. } 102. /**
103. * 尾页 104. */
105. public void lastPage(){
106. currentPage = totalpages;
107. pageSartRow = (currentPage-1)*pageSize; 108. } 109. 110. /** 111. * Go 112. */
113. public void goPage(int go){
114. //当前页等于用户输入跳转的那一页 115. currentPage = go;
116. //如果用户输入的大于总页数,go to last page 117. if (currentPage>=totalpages) { 118. currentPage=totalpages; 119. }else if(currentPage<=1){
120. //if input <= 1, go to first page 121. currentPage=1; 122. }
123. pageSartRow = (currentPage-1)*pageSize; 124. } 125. /**
126. * 设置页面显示的数据条数 127. * @param show 数据条数 128. */
129. public void showcount(int show){ 130. setPageSize(show); 131. } 132. 133.}
package com.rao.entitys;
import java.util.concurrent.CountDownLatch;
public class Pager { private int currentPage; //当前页 private int totalRows; //总行数 private int pageSartRow; //每页开始的数据行 private int totalpages; //总页数 private int pageSize; //每页 显示的数据行数量 public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getTotalRows() { return totalRows; } public void setTotalRows(int totalRows) { this.totalRows = totalRows; } public int getPageSartRow() { return pageSartRow;
}
public void setPageSartRow(int pageSartRow) { this.pageSartRow = pageSartRow; }
public int getTotalpages() { return totalpages; }
public void setTotalpages(int totalpages) { this.totalpages = totalpages; }
public int getPageSize() { return pageSize; }
public void setPageSize(int pageSize) { this.pageSize = pageSize; } /*
* 构造方法,初始化数据 */
public Pager(int totals,int size){ this.totalRows = totals; this.pageSize = size; //计算总页数, if (totalRows%pageSize!=0) { this.totalpages = totalRows/pageSize+1; }else { this.totalpages = totalRows/pageSize; } //默认当前页为第一页 this.currentPage = 1; //默认数据的开始为0 this.pageSartRow = 0; } /**
* 上一页 */
public void previousPage(){ //如果当前页小于等于1,返回 if (currentPage<=1) {
return; } //当前页减一页 currentPage--; //设置每页开始的数据行 pageSartRow = (currentPage-1)*pageSize; } /**
* 下一页 */
public void nextPage(){ //如果当前页大于总页数,设置当前页为最后一页 if (currentPage>=totalpages) { currentPage=totalpages; }else { //否则当前页加一页 currentPage++; } pageSartRow = (currentPage-1)*pageSize; } /**
* 首页 */
public void firsPage(){ currentPage=1; pageSartRow = (currentPage-1)*pageSize; } /**
* 尾页 */
public void lastPage(){ currentPage = totalpages; pageSartRow = (currentPage-1)*pageSize; } /** * Go */
public void goPage(int go){ //当前页等于用户输入跳转的那一页 currentPage = go; //如果用户输入的大于总页数,go to last page if (currentPage>=totalpages) { currentPage=totalpages;
}else if(currentPage<=1){ //if input <= 1, go to first page currentPage=1; } pageSartRow = (currentPage-1)*pageSize; } /** * 设置页面显示的数据条数 * @param show 数据条数 */ public void showcount(int show){ setPageSize(show); } }
然后我们需要一个工具类,用于获得一个Pger对象,在Action中使用:
PagerUtil.java
view plaincopy to clipboardprint? 01.package com.rao.util; 02.
03.import javax.servlet.http.HttpServletRequest; 04.
05.import org.hibernate.Hibernate; 06.
07.import com.rao.entitys.Pager; 08. 09./**
10. * @author raozhiyong 用于得到一个Pager的实例 11. */
12.public class PagerUtil {
13. public static Pager getPager(HttpServletRequest request, int totalRows) { 14. //得到页面传入的pagesize参数,也就是用户选中的值 15. String pageSizesString = request.getParameter(\"showcount\"); 16. int pageSize;
17. //如果这个参数为空的话,说明是第一次浏览,初始化页面默认的pagesize 为五条数据
18. if (pageSizesString==null) { 19. pageSize = 5; 20. }else {
21. //否则讲pageSize属性设置为用户选择的大小
22. pageSize = new Integer(pageSizesString); 23. }
24. //根据数据库中的数据总数和每页显示的pagesize,创建一个初始化的Pager对象
25. Pager pager = new Pager(totalRows,pageSize); 26. // 得到页面传输近来的当前页
27. String current = request.getParameter(\"current\");
28. // 如果传入的参数为空,则访问首页,默认当前页为第一页 29. // 如果不为空就重新设置当前页面的值 30. if (current != null) {
31. pager.setCurrentPage(new Integer(current)); 32. }
33. // 得到用户请求操作,首页,尾页,上一页,下一页 34.
35. String pagedo = request.getParameter(\"pagedo\"); 36. if (pagedo != null) {
37. if (\"first\".equalsIgnoreCase(pagedo)) { 38. pager.firsPage();
39. } else if (\"last\".equalsIgnoreCase(pagedo)) { 40. pager.lastPage();
41. } else if (\"previous\".equalsIgnoreCase(pagedo)) { 42. pager.previousPage();
43. } else if (\"next\".equalsIgnoreCase(pagedo)) { 44. pager.nextPage();
45. } else if (\"go\".equalsIgnoreCase(pagedo)) { 46. //接受用户输入的跳转页
47. String gocount = request.getParameter(\"gocount\");
48. // 初始化为回到第一页(也许用户输入的数据合法,那么这时候我们应当默认回到第一页)
49. int go = 1; 50. try {
51. go = new Integer(gocount); 52. } catch (Exception e) { 53. e.printStackTrace(); 54. }
55. pager.goPage(go);
56. } else if (\"select\".equalsIgnoreCase(pagedo)) {
57. String showcount = request.getParameter(\"showcount\"); 58. // 初始化为每页5条数据 59. int size = 5; 60. try {
61. size = new Integer(showcount); 62. } catch (Exception e) { 63. e.printStackTrace();
. }
65. pager.showcount(size); 66. } 67. }
68. return pager; 69. } 70. 71.}
package com.rao.util;
import javax.servlet.http.HttpServletRequest;
import org.hibernate.Hibernate;
import com.rao.entitys.Pager; /**
* @author raozhiyong 用于得到一个Pager的实例 */
public class PagerUtil { public static Pager getPager(HttpServletRequest request, int totalRows) { //得到页面传入的pagesize参数,也就是用户选中的值 String pageSizesString = request.getParameter(\"showcount\"); int pageSize; //如果这个参数为空的话,说明是第一次浏览,初始化页面默认的pagesize 为五条数据 if (pageSizesString==null) { pageSize = 5; }else { //否则讲pageSize属性设置为用户选择的大小 pageSize = new Integer(pageSizesString); } //根据数据库中的数据总数和每页显示的pagesize,创建一个初始化的Pager对象 Pager pager = new Pager(totalRows,pageSize); // 得到页面传输近来的当前页 String current = request.getParameter(\"current\"); // 如果传入的参数为空,则访问首页,默认当前页为第一页 // 如果不为空就重新设置当前页面的值 if (current != null) { pager.setCurrentPage(new Integer(current)); } // 得到用户请求操作,首页,尾页,上一页,下一页 String pagedo = request.getParameter(\"pagedo\");
if (pagedo != null) { if (\"first\".equalsIgnoreCase(pagedo)) { pager.firsPage(); } else if (\"last\".equalsIgnoreCase(pagedo)) { pager.lastPage(); } else if (\"previous\".equalsIgnoreCase(pagedo)) { pager.previousPage(); } else if (\"next\".equalsIgnoreCase(pagedo)) { pager.nextPage(); } else if (\"go\".equalsIgnoreCase(pagedo)) { //接受用户输入的跳转页 String gocount = request.getParameter(\"gocount\"); // 初始化为回到第一页(也许用户输入的数据合法,那么这时候我们应当默认回到第一页) int go = 1; try { go = new Integer(gocount); } catch (Exception e) { e.printStackTrace(); } pager.goPage(go); } else if (\"select\".equalsIgnoreCase(pagedo)) { String showcount = request.getParameter(\"showcount\"); // 初始化为每页5条数据 int size = 5; try { size = new Integer(showcount); } catch (Exception e) { e.printStackTrace(); } pager.showcount(size); } } return pager; } }
Struts中Action的代码如下:
view plaincopy to clipboardprint?
01.public ActionForward all(ActionMapping mapping, ActionForm form, 02. HttpServletRequest request, HttpServletResponse response) {
03. System.out.println(\"=========all========\"); 04. String uriString = null; 05.
06. try { 07.
08. // 得到数据的总条数
09. int totalRows = studentDao.totalCount(); 10. //获得一个Pager对象
11. Pager pager = PagerUtil.getPager(request, totalRows); 12. //取出相应的数据 13. List studentDao.selectStudentList(pager.getPageSartRow(),pager.getPageSize()); 14. //将pager对象共享的request作用范围中,以便页面使用 15. request.setAttribute(\"pager\
16. //将查询到的List共享的request作用范围中,以便页面使用 17. request.setAttribute(\"stulist\ 18. uriString = \"list\"; 19. } catch (Exception e) { 20. uriString = \"error\"; 21. e.printStackTrace(); 22. }
23. return mapping.findForward(uriString); 24.} public ActionForward all(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { System.out.println(\"=========all========\"); String uriString = null; try { // 得到数据的总条数 int totalRows = studentDao.totalCount(); //获得一个Pager对象 Pager pager = PagerUtil.getPager(request, totalRows); //取出相应的数据 List stulist
studentDao.selectStudentList(pager.getPageSartRow(),pager.getPageSize()); //将pager对象共享的request作用范围中,以便页面使用 request.setAttribute(\"pager\ //将查询到的List共享的request作用范围中,以便页面使用 request.setAttribute(\"stulist\ uriString = \"list\"; } catch (Exception e) { uriString = \"error\";
stulist =
=
e.printStackTrace(); } return mapping.findForward(uriString); }
以上的Action使用了Hibernate中的两个方法:
1.totalCount():得到总数据量;
2.selectStudentList(pager.getPageSartRow(),pager.getPageSize()); 得到请求的List
Hibernate范围中的代码如下:
view plaincopy to clipboardprint? 01./**
02. * 查询所有学生信息 03. */
04.public List selectStudentList(int pageStartRow,int pageSize) { 05. List list = new ArrayList(); 06. try {
07. session = HibernateSessionFactory.getSession(); 08. final String hql = \"from Student\";
09. Query query = session.createQuery(hql); 10. query.setFirstResult(pageStartRow); 11. query.setMaxResults(pageSize); 12. list = query.list();
13. Hibernate.initialize(list); 14.
15. } catch (HibernateException e) { 16. if (transaction!=null) { 17. transaction.rollback(); 18. }
19. e.printStackTrace(); 20. } finally {
21. //session.close(); 22. }
23. return list; 24.} 25. 26.
27.public int totalCount() { 28. int count = 0; 29. try {
30. session = HibernateSessionFactory.getSession();
31.
32. //HQL Queqy
33. final String hql = \"select count(*) from Student\"; 34. Query query = session.createQuery(hql);
35. //count = ((Number)query.uniqueResult()).intValue(); 36. count = ((Number)query.iterate().next()).intValue(); 37.
38. //QBC Query
39. /*Criteria criteria = session.createCriteria(Student.class); 40. ProjectionList pList = Projections.projectionList(); 41. pList.add(Projections.rowCount()); 42. criteria.setProjection(pList);
43. count = ((Number)criteria.uniqueResult()).intValue();*/ 44. } catch (HibernateException e) { 45. if (transaction!=null) { 46. transaction.rollback(); 47. }
48. e.printStackTrace(); 49. } finally {
50. session.close(); 51. }
52. return count; 53.} /** * 查询所有学生信息 */ public List selectStudentList(int pageStartRow,int pageSize) { List list = new ArrayList(); try { session = HibernateSessionFactory.getSession(); final String hql = \"from Student\"; Query query = session.createQuery(hql); query.setFirstResult(pageStartRow); query.setMaxResults(pageSize); list = query.list(); Hibernate.initialize(list); } catch (HibernateException e) { if (transaction!=null) { transaction.rollback(); } e.printStackTrace(); } finally { //session.close();
} return list; } public int totalCount() { int count = 0; try { session = HibernateSessionFactory.getSession(); //HQL Queqy final String hql = \"select count(*) from Student\"; Query query = session.createQuery(hql); //count = ((Number)query.uniqueResult()).intValue(); count = ((Number)query.iterate().next()).intValue(); //QBC Query /*Criteria criteria = session.createCriteria(Student.class); ProjectionList pList = Projections.projectionList(); pList.add(Projections.rowCount()); criteria.setProjection(pList); count = ((Number)criteria.uniqueResult()).intValue();*/ } catch (HibernateException e) { if (transaction!=null) { transaction.rollback(); } e.printStackTrace(); } finally { session.close(); } return count; }
最后我们来看看前台代码:
view plaincopy to clipboardprint?
01.<%@ page language=\"java\" pageEncoding=\"gbk\"%> 02.
03.<%@ taglib uri=\"http://struts.apache.org/tags-bean\" prefix=\"bean\"%> 04.<%@ taglib uri=\"http://struts.apache.org/tags-html\" prefix=\"html\"%> 05.<%@ taglib uri=\"http://struts.apache.org/tags-logic\" prefix=\"logic\"%> 06.<%@ taglib uri=\"http://struts.apache.org/tags-tiles\" prefix=\"tiles\"%> 07.
08.
09. 10. 12. 14. 16. 17. 18. 19. 20. 21. 24. 25. 26. 27. 28. 30. 学生信息管理 31. 32. 33. 34. 新增学生信息 35. 37. 41. 44. 48. 51. 52. 班级 53. 54. 60. 63. . 68. 72. 76. 80. 86. 88. 91. 92. 93. 94. 95. 96. 140. 141. 142. 143. 共有 144. 151. 153. 首页 154. 上一页 155. 下一页 156. 尾页 157. 159. 160. 161. 162. onkeypress=\"return event.keyCode>=48&&event.keyCode<=57||event.keyCode==46\" 163. onpaste=\"return !clipboardData.getData('text').match(/\\D/)\" 1. ondragenter=\"return false\" style=\"ime-mode: Disabled\" /> 165. GO 166. 167. 168. 每页显示 169. onchange=\"showCount();\"> 170. 171. ${pager.pageSize==5?'selected=\"selected\"':\"\ 172. 5 173. 174. ${pager.pageSize==10?'selected=\"selected\"':\"\ 175. 10 176. 177. ${pager.pageSize==20?'selected=\"selected\"':\"\ 178. 20 179. 180. ${pager.pageSize==30?'selected=\"selected\"':\"\ 181. 30 182. 183. ${pager.pageSize==40?'selected=\"selected\"':\"\ 184. 40 185. 186. ${pager.pageSize==50?'selected=\"selected\"':\"\ 187. 50 188. 1. 190. 条数据 191. 36.
38. 59. 39. 编号 40. 42. 姓名 43. 45. 年龄 46.
47. 49. 地址 50. 55. 操作 56. 58.
57. 62. 67. 71. 75. 79. 83. 84. 85.
194. 195. 193. 152. 158. 192.
<%@ page language=\"java\" pageEncoding=\"gbk\"%>
<%@ taglib uri=\"http://struts.apache.org/tags-bean\" prefix=\"bean\"%> <%@ taglib uri=\"http://struts.apache.org/tags-html\" prefix=\"html\"%> <%@ taglib uri=\"http://struts.apache.org/tags-logic\" prefix=\"logic\"%> <%@ taglib uri=\"http://struts.apache.org/tags-tiles\" prefix=\"tiles\"%>
姓名 条数据 学生信息管理
新增学生信息
编号 年龄
地址 班级 操作
共有 首页 上一页 下一页 尾页 event.keyCode>=48&&event.keyCode<=57||event.keyCode==46\" onpaste=\"return !clipboardData.getData('text').match(/\\D/)\" ondragenter=\"return false\" style=\"ime-mode: Disabled\" /> GO 每页显示
从jsp页面上可以看到,我把分页模拟成了一个组件化的用例,放在一个table中,我们可以在任何一个项目中使用它,只要能将代码复制即可,当然还要修改下请求的路径,这个就要以项目为中心了,这里的请求我大多是用的javasript,因为我们必须在没有表单的情况下获得用户的输入和选择,所以我选择了JavaScript,当然还有很多方法,大家有兴趣可以去研究。由于我在代码中注释都写得很清楚,所以我在这里只是讲下其中一个路径问题:stutent.do?dowhat=all&pagedo=next¤t=${pager.currentPage}&showcount=\" + count
dowhat : 这是Action的请求,我用的是DispatchAction,这里指的是Action的请求参数;
current :当前页,从request中获得;
showcount: 用户选择的当前显示多少行数据,也就是pager的pageSize;
gocount : 用户输入的转到第几个的数值;
在贴出学习时对分页的分析图片吧:
http://b31.photo.store.qq.com/http_imgload.cgi?/rurl4_b=25b845d29607d32ca11c8a09617bf58b98eb6d2c485aacff502cc045c39bc12e069bea3681c5d7142e01c1ce54705b0698c740fe83c34a8bc4fef145d592f04a7df7e340263f8e4c7ae787515f321b1f26dc&a=25&b=31
还有本例的图样,大家可以先睹为快:
http://b31.photo.store.qq.com/http_imgload.cgi?/rurl4_b=25b845d29607d32ca11c8a09617bf58b1b7471265f322d130cd674d75cc0fb024fff79b1394f042be3cc3104c3c82414dfac42b6a8edc705f556ff996e15d4f4d10233e3b90edcd1c1ffd94321af0177191a7b35&a=31&b=31
就是这么多,希望对大家有所帮助!
本文来自CSDN博客,转载请http://blog.csdn.net/raozhiyong11/archive/2010/01/16/5200459.aspx
struts+spring+hibernate下通用分页功能的实现 1、定义通用分页model
package cn.com.bank.mmpf.model; import cn.com.bank.mmpf.util.Constants; /**
* Created by IntelliJ IDEA. * User: willsu * Date: 2005-6-10 * Time: 16:51:22
标明出处:
* To change this template use File | Settings | File Templates. */
public class PageControl implements java.io.Serializable{ private int pageno=1; //当前页码
private int pagesize=Constants.PAGE_SIZE_DEFALUT; //每页行数 private int rowcount; //总行数 private int pagecount; //总页数
private boolean useprevious;//前一页是否能用 private boolean usebehind;//后一页是否能用 private boolean usepage=true;//是否分页
public int getPageno() { return pageno; }
public void setPageno(int pageno) { this.pageno = pageno; }
public int getPagesize() { return pagesize; }
public void setPagesize(int pagesize) { if (pagesize==0){//0-->不分页 usepage=false; pagecount=1; pageno=1;
useprevious=false; usebehind=false;
}
this.pagesize = pagesize; }
public int getRowcount() { return rowcount; }
public void setRowcount(int rowcount) { this.rowcount = rowcount; if(usepage){
pagecount=(rowcount % pagesize ==0 )?(rowcount /pagesize ) : ( rowcount / pagesize +1);
useprevious=pageno==1?false:true; usebehind=pageno==pagecount?false:true; } }
public int getPagecount() { return pagecount; }
public void setPagecount(int pagecount) { this.pagecount = pagecount; }
public boolean isUseprevious() { return useprevious; }
public void setUseprevious(boolean useprevious) { this.useprevious = useprevious; }
public boolean isUsebehind() { return usebehind; }
public void setUsebehind(boolean usebehind) { this.usebehind = usebehind; }
public boolean isUsepage() { return usepage; }
public void setUsepage(boolean usepage) { this.usepage = usepage; } }
2、hibernate分页实现函数--〉放在底层类中
public class CommonServiceImpl extends HibernateDaoSupport implements CommonService{ 。。。
//通用分页处理
public List getListForPage(final String hsql,PageControl pageControl) throws Exception {
List pagelist=null;
Session session=getSession(); try {
pageControl.setRowcount(getTotalCount(session,hsql)); //更新pagecontrol的各种属性 important
if(pageControl.isUsepage()){ //是否分页
// sql=hsql+ \" limit \" + (pageNog-1)*page_size + \ // offices= getHibernateTemplate().find(sql); //被屏蔽掉的是原来的处理 //以下是改过的处理方法 Query query=null;
query=session.createQuery(hsql);
int start=(pageControl.getPageno()-1)*pageControl.getPagesize(); int rowNum=pageControl.getPagesize(); query.setFirstResult(start); query.setMaxResults(rowNum); pagelist = query.list(); }else{
pagelist=session.find(hsql); } } finally {
session.close(); }
return pagelist; }
//计算表的总行数
private int getTotalCount(Session session, String hql) throws Exception {
Integer amount = new Integer(0); int sql_from = hql.indexOf(\"from\");
int sql_orderby=hql.indexOf(\"order by\");//为了改进 String countStr=\"\"; if(sql_orderby>0) {
countStr=\"select count(*) \"+hql.substring(sql_from,sql_orderby); }
else
countStr = \"select count(*) \"+hql.substring(sql_from); Query query = session.createQuery(countStr); if(!query.list().isEmpty()){
amount = (Integer) query.list().get(0); } else return 0;
return amount.intValue(); } }
3、实际service对象继承commonserviceimpl
public class LogServiceImpl extends CommonServiceImpl implements LogService{ public List getLogByType(Integer logtype, PageControl pageControl) throws Exception{
String hql=\"from \"+Systemlog.class.getName()+\" as a where a.baselogtype.id=\"+logtype+\" order by a.opertime desc\"; return getListForPage(hql,pageControl); } }
4、action实现
public class LogListAction extends BaseAction{
public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception {
String forward =Constants.FORWORD_FIAL; LogService service = (LogService)
getWebApplicationContext().getBean(Constants.LOG_SERVICE);//获得service对象 Object obj=((DynaActionForm)
actionForm).get(Constants.PAGE_CONTROL_MODEL); Object obj1=((DynaActionForm)
actionForm).get(Constants.PAGE_FILTER_ID);
Integer filterid=obj1==null?new Integer(1):(Integer)obj1;
PageControl pageControl=obj==null?new PageControl():(PageControl)obj; try {
List mainlist=service.getLogByType(filterid,pageControl); //调用分页方法得到list
List filterlist=service.loadAll(Baselogtype.class);
((DynaActionForm) actionForm).set(Constants.PAGE_ENTITY_LIST, mainlist);
((DynaActionForm) actionForm).set(Constants.PAGE_FILTER_LIST, filterlist);
((DynaActionForm) actionForm).set(Constants.PAGE_FILTER_ID,filterid); ((DynaActionForm)
actionForm).set(Constants.PAGE_CONTROL_MODEL,pageControl); forward = Constants.FORWORD_SUCCESS; } catch (Exception e) {
ActionErrors errors = new ActionErrors(); errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(Constants.ERROR_LIST,e.getMessage())); saveErrors(request, errors); }
return actionMapping.findForward(forward); } }
5、jsp页面
5.1、分页部分代码:
共 共 首页 property=\"pagecontrolmodel.pageno\" name=\"LogListForm\"/>-1)\">前一页 property=\"pagecontrolmodel.pageno\" name=\"LogListForm\"/>+1)\">后一页 property=\"pagecontrolmodel.pagecount\" name=\"LogListForm\"/>)\">末页 跳至
通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询: 1、QBE(Qurey By Example)检索方式
QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。 Java代码 1. /**
2. * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录
3. * @param pageNo
4. * 当前页数 5. * @param pageSize
6. * 每页显示的记录数 7. * @param object
8. * 将查询条件封装为Object 9. * @return 将查询结果封装为Pager返回 10. */
11.public Pager findPageByExample(int pageNo, int pageSize, Object object) 12.{
13. Pager pager = null; 14. try 15. {
16. Criteria criteria = this.getSession().createCriteria(
17. Class.forName(this.getEntity())); 18.
19. if (object != null) 20. {
21. criteria.add(Example.create(object).enableLike());
22. } 23.
24. // 获取根据条件分页查询的总行数
25. int rowCount = (Integer) criteria.setProjection( 26. Projections.rowCount()).uniqueResult(); 27. criteria.setProjection(null); 28.
29. criteria.setFirstResult((pageNo - 1) * pageSize); 30. criteria.setMaxResults(pageSize); 31.
32. List result = criteria.list(); 33.
34. pager = new Pager(pageSize, pageNo, rowCount, result); 35.
36. } catch (RuntimeException re) 37. {
38. throw re; 39. } finally 40. {
41. return pager; 42. } 43. 44.}
注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。
在BO层将需要模糊查询的列用\"%%\"串起来,不然仍然和\"=\"一样。 BO层代码: Java代码 1. /**
2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
3. * @param pageNo
4. * 当前的页码 5. * @param pageSize
6. * 每页显示的记录数 7. * @param mendName
8. * 抢修人员的名称 9. * @param specialty
10. * 抢修人员的工种 11. * @param post
12. * 抢修人员的职称
13. * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
14. */
15.public Pager getInfoByQuery(int pageNo, int pageSize, String mendName,
16. String specialty, String post) 17.{ 18.
19. EicMend eicMend = new EicMend();
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 != null && post.length() > 0) 29. {
30. eicMend.setPost(post); 31. } 32.
33. Pager pager = erpManagerDao
34. .findPageByExample(pageNo, pageSize, eicMend); 35. return pager; 36.}
执行SQL语句如下: Sql代码
1. Hibernate: select count(*) as y0_ from YJZX.EIC_MEND this_ wher
e
2. (this_.MENDNAME like ? and this_.POST like ?) 3.
4. Hibernate: select * from ( select this_.MENDID as MENDID23_0_, „„
5. this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where
6. (this_.MENDNAME like ? and this_.POST like ?) ) where rownum <= ?
所以只需将需模糊查询的列用“%%”链接即可。
2、QBC(Qurey By Criteria)检索方式
采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查
询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Restrictions接口组成,它支持在运行时动态生成查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用Criterion„不定参数传参。
Map传参方式范例如下: DAO层: Java代码 1. /**
2. * @function 分页显示符合所有的记录数,将查询结果封装为Pager 3. * @param pageNo
4. * 当前页数 5. * @param pageSize
6. * 每页显示的条数 7. * @param map
8. * 将查询条件封装为map 9. * @return 查询结果Pager 10. */
11.public Pager findPageByCriteria(int pageNo, int pageSize, Map map) 12.{
13. Pager pager = null; 14. try 15. {
16. Criteria criteria = this.getSession().createCriteria(
17. Class.forName(this.getEntity())); 18.
19. if (map != null) 20. {
21. Set 24. criteria.add(Restrictions.like(key, map.get(key))); 25. } 26. } 27. 28. // 获取根据条件分页查询的总行数 29. int rowCount = (Integer) criteria.setProjection( 30. Projections.rowCount()).uniqueResult(); 31. criteria.setProjection(null); 32. 33. criteria.setFirstResult((pageNo - 1) * pageSize); 34. criteria.setMaxResults(pageSize); 35. 36. List result = criteria.list(); 37. 38. pager = new Pager(pageSize, pageNo, rowCount, result); 39. 40. } catch (RuntimeException re) 41. { 42. throw re; 43. } finally 44. { 45. return pager; 46. } 47. 48.} Map传参方式对应BO层代码: Java代码 1. /** 2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录 3. * @param pageNo 4. * 当前的页码 5. * @param pageSize 6. * 每页显示的记录数 7. * @param mendName 8. * 抢修人员的名称 9. * @param specialty 10. * 抢修人员的工种 11. * @param post 12. * 抢修人员的职称 13. * @return 将符合条件的记录数以及页码信息封装成PagerBean返回 14. */ 15.public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName, 16. String specialty, String post) 17.{ 18. 19. Map map = new HashMap(); 20. 21. if (mendName != null && mendName.length() > 0) 22. { 23. map.put(\"mendname\24. } 25. if (specialty != null && specialty.length() > 0) 26. { 27. map.put(\"specialty\28. } 29. if (post != null && post.length() > 0) 30. { 31. map.put(\"post\32. } 33. 34. Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map); 35. return pager; 36.} 第二种方式:Criterion„不定参数传参方式。其代码如下所示: DAO层代码: Java代码 1. /** 2. * @function 分页显示符合所有的记录数,将查询结果封装为Pager 3. * @param pageNo 4. * 当前页数 5. * @param pageSize 6. * 每页显示的条数 7. * @param criterions 8. * 不定参数Criterion 9. * @return 查询结果Pager 10. */ 11.public Pager findPageByCriteria(int pageNo, int pageSize, 12. Criterion... criterions) 13.{ 14. Pager pager = null; 15. try 16. { 17. Criteria criteria = this.getSession().createCriteria( 18. Class.forName(this.getEntity())); 19. if (criterions != null) 20. { 21. for (Criterion criterion : criterions) 22. { 23. if (criterion != null) 24. { 25. criteria.add(criterion); 26. } 27. 28. } 29. } 30. 31. // 获取根据条件分页查询的总行数 32. int rowCount = (Integer) criteria.setProjection( 33. Projections.rowCount()).uniqueResult(); 34. criteria.setProjection(null); 35. 36. criteria.setFirstResult((pageNo - 1) * pageSize); 37. criteria.setMaxResults(pageSize); 38. 39. List result = criteria.list(); 40. 41. pager = new Pager(pageSize, pageNo, rowCount, result); 42. 43. } catch (RuntimeException re) 44. { 45. throw re; 46. } finally 47. { 48. return pager; 49. } 50. 51.} Criterion„不定参数传参方式对应BO层代码: Java代码 1. /** 2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录 3. * @param pageNo 4. * 当前的页码 5. * @param pageSize 6. * 每页显示的记录数 7. * @param mendName 8. * 抢修人员的名称 9. * @param specialty 10. * 抢修人员的工种 11. * @param post 12. * 抢修人员的职称 13. * @return 将符合条件的记录数以及页码信息封装成PagerBean返回 14. */ 15.public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName, 16. String specialty, String post) 17.{ 18. Criterion criterion1 = null, criterion2 = null, criterion3 = null; 19. if (mendName != null && mendName.length() > 0) 20. { 21. criterion1 = Restrictions.ilike(\"mendname\ 22. MatchMode.ANYWHERE); 23. } 24. 25. if (specialty != null && specialty.length() > 0) 26. { 27. criterion2 = Restrictions.ilike(\"specialty\ 28. MatchMode.EXACT); 29. } 30. 31. if (post != null && post.length() > 0) 32. { 33. criterion3 = Restrictions.ilike(\"post\.EXACT); 34. } 35. 36. Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, 37. criterion1, criterion2, criterion3); 38. 39. return pager; 40.} 3、HQL检索方式 HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言 有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。 使用Query接口分页查询DAO代码: Java代码 1. /** 2. * @function 分页显示符合所有的记录数,将查询结果封装为Pager 3. * @param pageNo 4. * 当前页数 5. * @param pageSize 6. * 每页显示的条数 7. * @param instance 8. * 将查询条件封装为专家Bean 9. * @return 查询结果Pager 10. */ 11.public List
因篇幅问题不能全部显示,请点此查看更多更全内容