虽然Hibernate帮助我们完成了分页功能,但若有的数据库不支技分页查询,Hibernate的分页的效率可就不高了,它先查询出一部分然后现在内存当中取出你所要的那一页。
Hibernate支持Native SQL(使用SQL Query)也、支持存储过程下面就来说说Hibernate调用存储过程来分页
第一步在数据库创建Ture_Page存储过程
Create PROCEDURE Ture_Page
@PageSize int, --每页的行数
@PageIndex int, --1 代表第一页
@Col varchar(250), --要显示的字段
@Table varchar(200), --所用到的表,复条的话就写from与where之间的内容
@Where varchar(200)='', --所用到的条件
@OKey varchar(50), --排序字段
@Order varchar(20)='ASC' --排序方式
as
____declare @cmdstr varchar(2000)
____declare @cmdstrcount varchar(2000)
set no____count on
set @cmdstr='____select top '
set @cmdstr=@cmdstr+convert(nvarchar,@PageSize)
if @Order='DESC' and @PageIndex>1
set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'<'
else if @PageIndex=1
set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>='
else
set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>'
if @PageIndex>1
begin
if @Order='ASC'
set @cmdstr=@cmdstr+'(____select max ('+@OKey+') from (____select top '
else
set @cmdstr=@cmdstr+'(____select min ('+@OKey+') from (____select top '
set @cmdstr=@cmdstr+convert(nvarchar,(@PageIndex-1)*@PageSize)
if @Where<>''
set @cmdstr=@cmdstr+' '+@OKey+' from '+@Table+' where '+@Where+' order by '+@OKey+' '+@Order+') as t) '
else
set @cmdstr=@cmdstr+' '+@OKey+' from '+@Table+' order by '+@OKey+' '+@Order+') as t) '
end
else
set @cmdstr=@cmdstr+' 0 ' --convert(nvarchar,0)
print @cmdstr
if @Where<>''
set @cmdstr=(@cmdstr+' and '+@Where+' order by '+@OKey+' '+@Order)
else
set @cmdstr=(@cmdstr+' order by '+@OKey+' '+@Order)
print @cmdstr
exec(@cmdstr)
set no____count off
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
第二部 在相应Hibernate中entity实体相对应的xx.hbm.sml中作如下的配置:
<hibernate-mapping>
<class name="com.svse.entity.TNew" table="t_new" schema="dbo" catalog="shoa">
<id name="NId" type="java.lang.Integer">
<column name="n_id" />
<generator class="native" />
</id>
<property name="NTitle" type="java.lang.String">
<column name="n_title" length="50" />
</property>
<property name="NContent" type="java.lang.String">
<column name="n_content" />
</property>
<property name="NDate" type="java.util.Date">
<column name="n_date" length="23" />
</property>
<property name="NFlag" type="java.lang.Integer">
<column name="n_flag" />
</property>
</class>
<!-- 存储过程 -->
<sql-query name="newsTurnPage" callable="true">
<return alias="TNew" class="com.svse.entity.TNew">
<return-property name="NId" column="n_id"/>
<return-property name="NTitle" column="n_title"/>
<return-property name="NContent" column="n_content" />
<return-property name="NDate" column="n_date"/>
<return-property name="NFlag" column="n_flag" />
</return>
{call Ture_Page(?,?,?,?,?,?,?)}
</sql-query>
</hibernate-mapping>
第三部 查询方法的实现
//分页查询
public List turnPage(int size, int currpage) {
List list=new ArrayList();
try {
this.beginTran();
Query query=this.getSession().getNamedQuery("newsTurnPage");
query.setInteger(0,size);
query.setInteger(1, currpage);
query.setString(2, "n_id,n_title,n_content,n_date,n_flag");
query.setString(3, "t_new");
query.setString(4,"");
query.setString(5, "n_id");
query.setString(6, "desc");
list = query.list();
} catch (Exception e) {
e.printStackTrace();
}finally{
this.end();
}
return list;
}
第四步 分页相关设置
public ActionForward getAllNews(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
//查出所有的新闻
List list = nd.getAllNews();
int flag = Integer.parseInt(request.getParameter("flag"));
//新闻分页
String action=request.getParameter("action");
String cp=request.getParameter("curpage");
int curpage=0;
//总共有多少也
int count=list.size();
//每一页有多少条记录
int i=10;
//计算一共也多少页
int allpage=count%i;
if(allpage>0)
{
allpage=(count/i)+1;
}
else
{
allpage=count/i;
}
//判断传来的当前页
if(cp==null)
{
curpage=1;
}
else
{
curpage=Integer.parseInt(cp);
}
//判断操作
if(action==null)
{
action="first";
}
//第一次进来或是首页
if(action.equalsIgnoreCase("first"))
{
curpage=1;
}
//前一页
if(action.equalsIgnoreCase("front"))
{
if(curpage<=1)
{
curpage=1;
}
else
{
curpage=curpage-1;
}
}
//后一页
if(action.equalsIgnoreCase("next"))
{
if(curpage>=list.size())
{
curpage=curpage;
}
else
{
curpage=curpage+1;
}
}
//最后一夜
if(action.equalsIgnoreCase("last"))
{
curpage=allpage;
}
//获得分页信息
List list1=nd.turnPage(i, curpage);
request.setAttribute("NewsList", list1);
request.setAttribute("count", new Integer(count));
request.setAttribute("curpage", new Integer(curpage));
request.setAttribute("allpage", new Integer(allpage));
if (flag == 1) {
return mapping.findForward("showNews");
} else {
return mapping.findForward("showNews2");
}
}
第五 页面应用
在本类中,调用查询类存储过程时,调用session.getNamedQuery("…")方法来获得User.hbm.xml中配置的查询存储过程。在其余的存储过程调用的测试中,首先通过hibernate的session获得connection,然后调用connection对象的相应方法来实现存储过程的调用。
同样,这样做的话也会带来弊端可移植性差。改库的话也要创建该存储过程
分享到:
相关推荐
本人用struts+hibernate写的分页,有详细的注解,方便新手学习,在jsp中实现首页下一页上一页末页功能.index.jsp控制showlist.jsp页面中每页显示的信息条数,本实例在xp+tomcat5.5验证通过.数据库使用的sql2000中的pubs...
这是Java常用框架阶段在为学生答疑时做的一个SSH整合分页实例(第一部分),涉及了SSH整合、日期模糊查询、查询条件绑定、查询结果排序等功能,希望能为大家提供一些思路。 分页是绝大多数MIS系统必需的功能之一,...
最近经一位高人指点了解的一个display分页代码,结合struts+hibernate+pagTag。
struts+hibernate 分页实例
这是Java常用框架阶段在为学生答疑时做的一个SSH整合分页实例(第二部分),涉及了SSH整合、日期模糊查询、查询条件绑定、查询结果排序等功能,希望能为大家提供一些思路。 分页是绝大多数MIS系统必需的功能之一,...
j2ee中struts+hibernate+spring+pager-taglib分页实例 这套解决方案,是按照MVC的模式来做的,基于STRUTS框架。分为三个部分,表现层用的是JSP,其中用了JSTL和pager taglib做分页;控制层就是用的很传统的Action;...
采用struts+hibernate+spring技术,再结合javascript技术实现分页功能,希望对您有所帮助!
这是一个struts2+hibernate+spring整合的实例,带有分页功能,希望对刚接触struts2的朋友有些帮助。spring2.0,hibernate3.1分页用的是自字义标签,不要少了这个包standard.jar
使用spring struts hibernate 实现了一个分页的实例
本例主要是实现了struts2+spring3+hibernate3的 基本框架搭建的注册登录,以及用户增删改查,适于初学者学习。 包括:注册 登录功能 分页的实现 前端校验 验证码的实现 注册时有ajax 校验,登录时 后台从数据库...
三大最新流行框架整合,此实例包括了注册、查询、搜索、分页四大功能,适合入门的人学习,希望对你们有帮助。
Hibernate+struts2+spring_实现分页实例.doc
Hibernate+struts2+spring_实现分页实例
一个完整的Struts/hiberante实例,包含SQL Serve 2000数据库脚本,易懂,分页代码的实现
Struts2 + Hibernate 分页程序实例 邮箱: zengrijia2008@yahoo.com.cn
一个Struts1.2+Spring2.5+Hibernate3.2+Jmesa2.4.3+JmesaTag实现的强大分页控件例子 里 面有action实现分页和标签实现分页2个例子 action实现的分页 包括了表头排序,导出为PDF,TXT, excel等格式 jar包和数据库...
我专门申请了一个网盘.所有下载地址在下载下来的这个rar包里面都有详细的介绍和说明. 说一下这个rar里面带的东西.除了源码外带了几篇文档.分别是关于项目中所使用的dwr的配置.table组件的配置说明文档.junit单元...
最好的ssh分页代码。
主要介绍了Struts2+Hibernate实现数据分页的方法,结合实例形式分析了Struts2结合Hibernate实现数据分页的原理,步骤与相关实现代码,需要的朋友可以参考下