在Hibernate中有个方法是可以实现分页的
public List<LcmCase> getPageCase(PageBean pagebean,String hqlString){
session=getSessionFactory().getCurrentSession();
Query query=session.createQuery(hqlString);
query.setFirstResult(pagebean.getPagesize()*(pagebean.getPageindex()-1));
query.setMaxResults(pagebean.getPagesize());
List<LcmCase> pagecaseList=query.list();
return pagecaseList;
这个分页直接返回了一个封装了实体的集合,调用的时候很方便。但是却被师傅否定
具体什么不好,他要我好好想想,,惭愧,我实在是想不出来
如果不用这方法,那么就只有用存储过程实现了
用存储过程,那么就不能避免去封装实体对象,如果一张表有几十个字段,一个一个字段的封装
那不是要抓狂了!!而且还不通用
前辈们,
首先用hibernate实现的分页到底有什么弊端?
还有 如果用存储过程来实现,那么对于那些属性的封装该用什么方法来解决?
public List<LcmCase> getPageCase(PageBean pagebean,String hqlString){
session=getSessionFactory().getCurrentSession();
Query query=session.createQuery(hqlString);
query.setFirstResult(pagebean.getPagesize()*(pagebean.getPageindex()-1));
query.setMaxResults(pagebean.getPagesize());
List<LcmCase> pagecaseList=query.list();
return pagecaseList;
这个分页直接返回了一个封装了实体的集合,调用的时候很方便。但是却被师傅否定
具体什么不好,他要我好好想想,,惭愧,我实在是想不出来
如果不用这方法,那么就只有用存储过程实现了
用存储过程,那么就不能避免去封装实体对象,如果一张表有几十个字段,一个一个字段的封装
那不是要抓狂了!!而且还不通用
前辈们,
首先用hibernate实现的分页到底有什么弊端?
还有 如果用存储过程来实现,那么对于那些属性的封装该用什么方法来解决?
this.getHibernateTemplate().find(sql);进行分页(不过我没用)
但是你的程序好奇怪,你没有用Spring吗?
如果你有Spring和Hibernate整合,获取连接应该不是:
session=getSessionFactory().getCurrentSession();
而是:
session = this.getSession();就好啦我最近也是做了项目也是用ssh的,我把你的代码改成:
public List <LcmCase> getPageCase(int pageNum,int item,String sql){ Query query = this.getSession().createQuery(sql)
.setFirstResult((pageNum-1)*item)
.setMaxResults(item);
List<LcmCase> list = query.list();
if(list > 0){
return list;
}else{
return 0;
}
}不踩我哈,我也是个小菜鸟!
这方法怎么样,
存储过程是SQL2005的相信你们都知道,我就不贴了Hibernate的配置文件:
<hibernate-mapping>
<class name="com.mengya.entity.TDepart" table="t_depart" schema="dbo" catalog="oaproject">
<id name="DId" type="java.lang.Integer">
<column name="d_id" />
<generator class="native" />
</id>
<property name="DName" type="java.lang.String">
<column name="d_name" length="50" />
</property>
<property name="DRe" type="java.lang.String">
<column name="d_re" />
</property>
<set name="TEmps" inverse="true">
<key>
<column name="d_id" />
</key>
<one-to-many class="com.mengya.entity.TEmp" />
</set>
</class>
<!--<sql-query>不在<class>内面-->
<sql-query name="TDepartTure_Page" callable="true">
<return alias="TDepart" class="com.mengya.entity.TDepart">
<return-property name="DId" column="d_id"/>
<return-property name="DName" column="d_name"/>
<return-property name="DRe" column="d_re"/>
</return>
{call Ture_Page(?,?,?,?,?,?,?)}
<query-param name="PageSize" type="int"/>
<query-param name="PageIndex" type="int"/>
<query-param name="Col" type="String"/>
<query-param name="Table" type="String"/>
<query-param name="Where" type="String"/>
<query-param name="OKey" type="String"/>
<query-param name="Order" type="String"/>
</sql-query>
</hibernate-mapping>
调用存储过程:
......
/*
* 分页查询所有部门信息
*/
public List getPageDepart(final int pagesize,final int pageindex){
List pagelist=null;
try { //这里我使用的Hibernate的getHibernateTemplate()方法也要可直接得到session
pagelist=getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query query=session.getNamedQuery("TDepartTure_Page");
query.setInteger(0, pagesize);
query.setInteger(1, pageindex);
query.setString(2, "d_id,d_name,d_re");
query.setString(3, "t_depart");
query.setString(4, "");
query.setString(5, "d_id");
query.setString(6, "desc");
return query.list();
}
});
} catch (RuntimeException e) {
e.printStackTrace();
throw e;
}
return pagelist;
}
我不明白的就是,他这里怎么两个方法套在一起用了?
/* 当前页号 页数从0开始。即 第一页 */
private int currentPage = 1;
/* 总页数 */
private int totalPage;
// /* 是否有首页*/
// private boolean hasFirstPage = false;
//
/* 是否有上一页 */
private boolean hasPrePage = false;
/* 是否有下一页 */
private boolean hasNextPage = false;
// /* 是否有末页 */
// private boolean hasLastPage = true;
//
/* 当前页记录开始索引 */
private int startIndex;
/* 记录总数 */
private int totalRows;
/* 每页记录数默认为10 */
private int pageSize = 10; /*对象记录集*/
private List result;
public Page(){
}
public Page(int currentPage,int totalRows,int pageSize){ this.currentPage = currentPage; //总记录数
this.totalRows = totalRows;
//设置页面记录数
this.setPageSize(pageSize);
//设置总页数 总页数为0 则为第一页
this.totalPage = totalRows/pageSize == 0? 1 : totalRows/pageSize ;
if(totalRows/pageSize>0){
//有余数总数加1
this.totalPage = totalRows%pageSize > 0 ? this.totalPage + 1 : this.totalPage;
}
if(currentPage>1){
this.hasPrePage = true;
}else {
this.hasPrePage = false;
}
if(currentPage<this.totalPage){
this.hasNextPage = true;
}else{
this.hasNextPage = false;
}
}
public int getCurrentPage() {
return currentPage;
} public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
} public boolean isHasNextPage() {
return hasNextPage;
} public void setHasNextPage(boolean hasNextPage) {
this.hasNextPage = hasNextPage;
} public boolean isHasPrePage() {
return hasPrePage;
} public void setHasPrePage(boolean hasPrePage) {
this.hasPrePage = hasPrePage;
} public int getPageSize() {
return pageSize;
} public void setPageSize(int pageSize) {
this.pageSize = pageSize;
} public int getStartIndex() {
return startIndex;
} public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
} public int getTotalPage() {
return totalPage;
} public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
} public int getTotalRows() {
return totalRows;
} public void setTotalRows(int totalRows) {
this.totalRows = totalRows;
} public List getResult() {
return result;
} public void setResult(List result) {
this.result = result;
}
}
public Page getAllObjects(final int currentPage, final int pageSize , final String sql) {
return (Page)this.getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException {
// TODO 自动生成方法存根
Page page = null;
Query q = session.createQuery(sql);
int total = q.list().size(); page = new Page(currentPage,total,pageSize);
//分页 当前页数 乘 每页分页记录数;
int firstResult = (currentPage-1)*pageSize == 0 ? 0 : (currentPage-1)*pageSize ;
q.setFirstResult(firstResult);
q.setMaxResults(pageSize);
page.setResult(q.list()); return page;
}});
}
//比如说查找EMP对象,则方法实现如下:
public Page getAllObjects(final int currentPage, final int pageSize)throws Exception {
String sql = "from Emp order by empno ";
return super.getAllObjects(currentPage, pageSize, sql); }//web层方面
Page page = empManager.getAllQueryObject(condition, currentPage, pageSize);
request.setAttribute("page", page);//jsp页面方面使用的jstl,使用其他sturts标签或者jsp也行 <c:forEach var="emp" items="${page.result}" varStatus="index">
<tr>
<td>${index.count+(page.currentPage-1)*page.pageSize }</td>
<td>${emp.empno }</td>
<td>${emp.ename}</td>
<td>${emp.job}</td>
<td>${emp.mgr}</td>
</tr>
</c:forEach> <td align="right" style="font-size:10pt;" colspan="9">
第${page.currentPage }页/共${page.totalPage }页
<c:choose>
<c:when test="${page.hasPrePage}">
<a href="javascript:jump('toFirst');">首页</a>|
<a href="javascript:jump('toPrePage');">上一页</a>|
</c:when>
<c:otherwise>首页|上一页|</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${page.hasNextPage}">
<a href="javascript:jump('toNextPage');">下一页</a>|
<a href="javascript:jump('toLastPage');">末页</a>
</c:when>
<c:otherwise>下一页|末页</c:otherwise>
</c:choose>
有了pagebean对象,总页码,当前页,是否存在上一页下一页问题都解决了,如果还有新的什么问题,自己还可以往pageBean添加
用Hibernate的分页是不是效率不好呢?
我现在还是改为用存储过程。连接是用JDBC的那种形式
最后返回的结果集通过反射的原理来封装对象