hibernate分页方法query.setFirstResult();setMaxResults();

hibernate分页方法query.setFirstResult();setMaxResults();,第1张

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">&nbsp;</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%">&nbsp;</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)从数据库查出所有数据再分页的方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10187645.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存