querysetFirstResult(1500);querysetMaxResults(15); 是基于数据库sql语句的分页方式,对于hibernate分页我只用过两种
1querysetFirstResult();querysetMaxResults(); 基于数据库sql
2queryscroll(); 基于内存分页
第一种方式,hibernate会根据不同数据库方言 翻译成对于的分页语句,执行效率比较高
第二种是 现将所需要分页数据的最大值 取到内存中,这样好处是 选择其他分页数据非常快,当软确定就是 会out of memory
你参考一下吧 我的不一定正确
//分页类
public class Pager {
private int pageNow = 1;//
private int pageSize = 7;//
private int totalPage;//
private int totalSize;//
public Pager(int pageNow, int totalSize) {
thispageNow = pageNow;
thistotalSize = totalSize;
}
public int getPageNow() {
return pageNow;
}
public void setPageNow(int pageNow) {
thispageNow = pageNow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
thispageSize = pageSize;
}
public int getTotalPage() {
totalPage = getTotalSize() / getPageSize();
if (totalSize % pageSize != 0)
totalPage++;
return totalPage;
}
public void setTotalPage(int totalPage) {
thistotalPage = totalPage;
}
public int getTotalSize() {
return totalSize;
}
public void setTotalSize(int totalSize) {
thistotalSize = totalSize;
}
public boolean isHasFirst() {
if (pageNow == 1)
return false;
else
return true;
}
public void setHasFirst(boolean hasFirst) {
}
public boolean isHasPre() {
if (thisisHasFirst())
return true;
else
return false;
}
public void setHasPre(boolean hasPre) {
}
public boolean isHasNext() {
if (isHasLast())
return true;
else
return false;
}
public void setHasNext(boolean hasNext) {
}
public boolean isHasLast() {
if (pageNow == thisgetTotalPage())
return false;
else
return true;
}
public void setHasLast(boolean hasLast) {
}
}
//service层
public class PageService {
@SuppressWarnings("unchecked")
public List<> list(int pageNow, int pageSize, String hql) {
Session session = HibernateSessionFactorygetSession();
Transaction tx = sessionbeginTransaction();
List<Object> objects;
Query query = sessioncreateQuery(hql);
querysetFirstResult(pageSize (pageNow - 1));
querysetMaxResults(pageSize);
objects = querylist();
txcommit();
return objects;
}
}
//在action中调用public String listUser() {
String hql = "from Userinfo u";
if (pslist(pageNow, pageSize, hql) != null) {
userinfos = (List<Userinfo>) pslist(pageNow, pageSize, hql);
Map<String, Object> request = (Map<String, Object>) ActionContext
getContext()get("request");
Pager page = new Pager(thisgetPageNow(), usgetUserSize());
requestput("userinfos", userinfos);
requestput("page", page);
return ActionSUCCESS;
} else {
return ActionLOGIN;
}
}
//jsp中
<body>
<table width="832" border="0" cellpadding="0" cellspacing="0" id="listBook">
<tr bgcolor="#E7E7E9">
<td width="5%" height="40"> </td>
<td width="25%" colspan="2" bgcolor="#E7E7E9"><div align="center" class="STYLE10">邮箱</div></td>
<td width="25%" colspan="2" bgcolor="#E7E7E9" class="STYLE1"><div align="center" class="STYLE10">密码</div></td>
<td width="25%" colspan="2" bgcolor="#E7E7E9" class="STYLE1"><div align="center" class="STYLE10">权限</div></td>
<td width="8%" bgcolor="#E7E7E9"><span class="STYLE8"></span></td>
<td width="8%" bgcolor="#E7E7E9"><span class="STYLE8"></span></td>
</tr>
<s:iterator value="#requestuserinfos" id="oneUser">
<tr>
<td height="50">
<div align="center">
<input type="checkbox" name="checkbox" value="checkbox" />
</div></td>
<td width="5%"></td>
<td width="23%" class="STYLE4"><s:property
value="#oneUseremail" /></td>
<td width="5%" class="STYLE4"></td>
<td width="23%"><span class="STYLE4"><s:property
value="#oneUserpassword" /></span></td>
<td width="5%" class="STYLE4"></td>
<td width="23%"><span class="STYLE4">
<s:if test="#oneUserpower==1">
普通用户
</s:if>
<s:else>
管理员
</s:else>
</span></td>
<td><div align="right" class="STYLE1"><a href='deleteUseruserid=<s:property value="#oneUserid"/>' class="STYLE5">删除|</a></div></td>
<td class="STYLE1"><a href='lookUseruserid=<s:property value="#oneUserid"/>&pageNow=<s:property value="#requestpagepageNow"/>' target="_self" class="STYLE5">修改</a></td>
</tr>
</s:iterator>
<tr>
<td colspan="9"><table width="832" border="0" cellspacing="0" bgcolor="#E7E7E9">
<s:set name="page" value="#requestpage"></s:set>
<tr>
<td width="70%"> </td>
<s:if test="#pageisHasPre()">
<td width="10%"><a href='listUserpageNow=<s:property value="#pagepageNow-1"/>' target="_self" class="STYLE3" >上一页</a></td>
</s:if>
<s:else>
<td width="10%"><a href="listUserpageNow=1" target="_self" class="STYLE3" >上一页</a></td>
</s:else>
<s:if test="#pageisHasNext()">
<td width="10%"><a href="listUserpageNow=<s:property value="#pagepageNow+1"/>" target="_self" class="STYLE3">下一页</a></td>
</s:if>
<s:else>
<td width="10%"><a href="listUserpageNow=<s:property value="#pagetotalPage"/>" target="_self" class="STYLE3">下一页</a></td>
</s:else>
<td width="10%"><a href="listUserpageNow=<s:property value="#pagetotalPage"/>" target="_self" class="STYLE3">尾页</a></td>
</tr>
</table></td>
</tr>
</table>
</body>
</html>
这是采用struts2+hibernate 做的,你可以参考一下
给你一个非缓存分页类的简单例子吧(Page类可以视作javabean):
/
@author Administrator
TODO 要更改此生成的类型注释的模板,请转至
窗口 - 首选项 - Java - 代码样式 - 代码模板
/
import javautil;
public class Pager {
private String PageUrl;
private boolean hasNext;
private boolean hasPrevious;
private String previousPage;
private String nextPage;
private int offset;
private int size;
private int length;
private int pagenumber;
public Pager(int offset,int length, int size, String url){
thisoffset=offset;
thislength=length;
thissize=size;
int index=urlindexOf("&pageroffset");
if (index>-1){
thisPageUrl=urlsubstring(0,index);
}else{
thisPageUrl=url;
}
}
public void setoffset(int offset){
thisoffset=offset;
}
public void setPagerUrl(String PagerUrl){
thisPageUrl=PagerUrl;
}
public void setsize(int size){
thissize=size;
}
public void setlength(int length){
thislength=length;
}
public int getoffset(){
return thisoffset;
}
public String getPageUrl(){
return thisPageUrl;
}
public boolean gethasNext(){
if((offset+1)length>=size){
hasNext=false;
}else{
hasNext=true;
}
return hasNext;
}
public boolean gethasPrevious(){
if(offset>=1){
thishasPrevious=true;
}else{
thishasPrevious=false;
}
return hasPrevious;
}
public String getpreviousPage(){
thispreviousPage="";
if (thisgethasPrevious()){
thispreviousPage=thisPageUrl+"&pageroffset="+(offset-1);
}
return previousPage;
}
public String getnextPage(){
thisnextPage="";
if(thisgethasNext()){
thisnextPage=thisPageUrl+"&pageroffset="+(offset+1);
}
return thisnextPage;
}
public int getpagenumber(){
float temppn=(float)size/(float)length;
pagenumber=new Float(temppn)intValue();
if (temppn>pagenumber){
thispagenumber++;
}
return thispagenumber;
}
public static ArrayList FindPageList(int offset,int length,List list){
ArrayList alist=new ArrayList();
for(int i=offsetlength; i<(offsetlength+length)&&i<listsize();i++){
alistadd(listget(i));
}
return alist;
}
}
具体使用:
1、在servlet初始化这个page
List list=DataUtilgetSpecifiedList();//得到整个数据列表
int offset=0;//便宜量
int length=10;//每页数据记录数
String pageOffset=requestgetParameter("pageroffset");
if(pageOffset==null||pageOffsetequals("")){
offset=0;
}else{
offset=IntegerparseInt(pageOffset);
}
String Url=requestgetRequestURL()toString()+""+requestgetQueryString();
Pager pager=new Pager(offset,length,listsize(),Url);
List RsList=PagerFindPageList(offset,length,list);
requestsetAttribute("Pager",pager);
requestsetAttribute("List",RsList);
RequestDispatcher dispatcher= requestgetRequestDispatcher("/UI/someModule/list_displayjsp");
dispatcherforward(request,response);
2、具体jsp中得到分页结果,并显示,并附页面跳转部分:
页面中得到分页结果
<%
List RpList=(List)requestgetAttribute("List");
Pager pager=(Pager)requestgetAttribute("Pager");
%>
<%--用for循环把RpList显示--%>
<!--页面跳转代码,这只是个形式,简化和改变方式的余地很大-->
<form name="pageForm"><%if(pagergethasPrevious()){%><a href="<%= pagergetpreviousPage()%>">prev</a>
<%}%>
<%if( pagergethasNext()){%><a href="<%=pagergetnextPage()%>">next</a><%}%><%if(pagergetpagenumber()>1) {%>第<select name="pager" onchange="windowlocation='<%=pagergetPageUrl()%>&pageroffset='+documentpageFormpagerselectedIndex;"><%for(int i=0;i<pagergetpagenumber();i++){%><option value=<%=i%> <%if(pagergetoffset()==i){ %>selected<%}%>><%=(i+1)%></option><%}%></select>页<%}%> 共<%=pagergetpagenumber()%>页</form>
ps:1、2两部分可以都放在页面类,不过你好像要MVC,所以给你这个代码。
是否可以解决您的问题?
首先要保证你的hql出来的结果是有顺序的,也就是说查多次的话,我每次取前几个或者从中间取,结果应该是一样的。
然后可以将结果集放到一个ArrayList中,通过传入参数第n页,以及每页m条数据这2个参数,你到ArrayList中去取就好了,然后放到一个新的ArrayList里。代码如下,假定Arraylist中已有数据:
for(int i=0;i<oldArrayListsize();i++){
if(i<=(n-1)m) continue;
if(i>nm) break;
newArrayListadd(oldArrayListget(i));
}
这样oldArrayList种就是分页数据了。
在获取完所有的list后只需要截取你所需要的一部分list就可以了,所以要知道你所需要的是从哪里开始,到哪里结束。有很多种方法,如果只是JSP里的话可以再次遍历获取的所有list集合,然后把满足条件的截取出来,开始的list下标应该是:(你要查询的页数-1)页面要显示的数据条数,也就是你这里的(page-1)pageRows,结束的地方也就是pagepageRows-1了。//这样应该可以写出来了吧建议把这个方法封装到一个类里面,一个方法就实现一种功能。当然这是比较麻烦的,现在流行框架,以后会学到的,在hibernate框架里用query语句很容易就实现了,现在时间多,多看看hibernate框架吧,推荐你一本书,hibernate in action,有中文版的。这个是你们以后入门了hibernate后看的。public List listOrderByItem(int pageRows,int page) { //page是要显示的页数,pageRows是你要显示的行数Session session = thisgetSession();//获取hibernate的session,hibernate自动生成的DAO里包含String hql = "from TBL_storage as tbl_s order by item";//hql语句Query query = sessioncreateQuery(hql);//hibernate的query,通过session创建querysetFirstResult((page-1)pageRows);//设置开始的下标querysetMaxResults(pageRows);//设置每页显示的行数return querylist();//得到所需要的结果集
以上就是关于hibernate分页方法query.setFirstResult();setMaxResults();全部的内容,包括:hibernate分页方法query.setFirstResult();setMaxResults();、java的jsp如何分页显示查询结果呢、(JAVA)从数据库查出所有数据再分页的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)