如何对多对多关系获得的set集合中的记录进行分页

来源:互联网 发布:香港出国gpa算法 编辑:程序博客网 时间:2024/05/12 04:10

ssh框架分页(包括如何对多对多关系获得的set集合中的记录进行分页)

(1)首先写一个PageModel类,里面写了获得pageNo(当前页数),pageSize(每页显示的条数),data(每页显示的记录),recordcount(总的记录数)的get,set方法下面的方法。

(2)在泛型Dao(GenericDaoImpl)中的写如下方法getByPager,可供其他的Dao类调用,调用时T需要换成相应的对象类型。

public PageModel<T> getByPager(int pageNo,int pageSize)

           throws DaoException {

       PageModel<T> pm = new PageModel<T>();

       //当前页码

       pm.setPageNo(pageNo);

       //每页显示的记录数

       pm.setPageSize(pageSize);

 

       Long count = (Long) sessionFactory.getCurrentSession().createQuery(

              "selectcount(o) from " +clazz.getName() +" o")

              .uniqueResult();

 

       if (count !=null && count.longValue() > 0) {

           //总记录数

           pm.setRecordCount(count.longValue());

 

           List<T> list = sessionFactory.getCurrentSession().createQuery(

                  "from " + clazz.getName() + " oORDER BY o DESC")

                  .setFirstResult((pageNo - 1) *pageSize).setMaxResults(

                         pageSize).list();

           //获取的集合

           pm.setData(list);

       }

 

       return pm;

    }

(3)action通过service调用Dao层的getByPager方法,同时传入pageSize和pageNo(可以是在action里面写死定义好的)获得pagerModel对象,再用该对象调用相应的get方法,将pageNo(当前页数),pageSize(每页显示的条数),data(每页显示的记录),recordcount(总的记录数)得到,保存到session里。

(4)在相应的jsp页面加pagerlib标签

 <%@ tagliburi="http://blog.csdn.net/qjyong/tags/pager"prefix="q"%>

在相应的部分写上从session里面获得的值

<c:forEachitems="${sessionScope.data}"var="wn"varStatus="vs">

对获得的每一条记录的操作

</c:forEach>

<div class="actions">

           <q:pagerpageSize="${sessionScope.pageSize}"

              pageNo="${sessionScope.pageNo}"

              url="MyEngLearn/frame/templateFrame.action"//分页操作对应的action中的方法

              recordCount="${sessionScope.recordCount}"/>

       </div>

当需要分页的内容是从多对多关系的set集合里取出的数据时,需要改写getByPager方法:把set集合转换成数组,再定义一个list集合,利用for循环遍历取出数组中的每一个元素,分别存放到list集合里,再将给list集合用set方法保存在pageModel对象中,进而在action里面用get方法获取。如下:(红色注解为过程

public PageModel<Resource> getMyResByPager(int pageNo,int pageSize,int uid) {

       PageModel<Resource> pm = new PageModel<Resource>();

       // 当前页码

       pm.setPageNo(pageNo);

       // 每页显示的记录数

       pm.setPageSize(pageSize);

       Query q=this.sessionFactory.getCurrentSession().createQuery("from User where UId=?");

       q.setParameter(0,uid);

       User u=(User)q.uniqueResult();//获得多对多关系中的一方User对象U

       Hibernate.initialize(u.getResset());//解决no sessionsession is closed的问题

       Set<Resource> myrset=u.getResset();//获得存放多对多中另一方对象(Resource)的set集合

       List<Resource> myrlist=new ArrayList<Resource>();//创建一个list集合用于存放每页显示的记录

       Object[] rarray=myrset.toArray();//将存放Resource对象的集合转化成数组

       for(int i=(pageNo-1)*pageSize;i<pageSize*pageNo;i++)

       {   if(myrset.size()>i){

           Resource r=(Resource) rarray[i];//获得数组中的每一个对象

           myrlist.add(r);//将这个对象加入到之前创建好的list集合中

           }

           else

           {

           break;

           }

       }//遍历该数组,(pageNo-1)*pageSize为每页显示的第一条记录的idpageSize*pageNo-1为每页显示的最后一条记录的id

       // 总记录条数

       Long count =(long)myrset.size();

 

       if (count !=null && count.longValue() > 0) {

           // 总记录数

           pm.setRecordCount(count.longValue());

 

           // 获取的集合

           pm.setData(myrlist);//把存放有每页应显示数据的list集合赋值给pagerModel对象。

       }

 

       return pm;

    }

昨天发现这个方法有一个问题,就是set集合里面存放的数据是无序的,所以分页是取出的记录会乱串,在网上查到注解或者配置文件都可以用order by来让set集合里面的记录按某一列顺序排列,但是自己没有成功。还希望知道怎么做的朋友,可以告诉我应该怎么使set集合里面的记录顺序取出?

后来自己还是用了一个很笨的方法,就是没用set集合,而用了list集合,在action中向list集合里面添加Resource对象时,手动写方法对list集合里面的对象进行遍历,如果有相同的就不向list集合里面加了,这样集合里面就不会有重复的数据,而且取出时也不会乱串了。虽然得到了想要的效果,但很麻烦,其实并没有真的解决问题。

0 0