Hibernate 多表查询分页核心代码

java 代码
  1. /**  
  2.   * 多表分页,然后影射成JAVABEAN 
  3.   * @param sqlcount  HSQL计算多表查询的总数 
  4.   * @param sqllist  HSQL多表查询的语句 
  5.   * @return  List 
  6.   * @throws InvocationTargetException  
  7.   * @throws IllegalAccessException  
  8.   * @throws InstantiationException  
  9.   * @throws IllegalArgumentException  
  10.   * @throws ClassNotFoundException  
  11.   * @throws NoSuchMethodException  
  12.   * @throws SecurityException  
  13.   * @throws DaoException 
  14.   */  
  15.  public List mutiTableList(String sqlcount,String sqllist,String classname,Class partypes[]) throws DataAccessException, HibernateException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, SecurityException, NoSuchMethodException {   
  16.    HttpServletRequest httpRequest = BaseAction.getHttpRequest();   
  17.    System.out.println("执行次数"+(count++));   
  18.    List res = new ArrayList();//将用于存放保存的结果集合  
  19.    org.hibernate.ScrollableResults srs = null;   
  20.    Session session = this.getSession();   
  21.    int total = queryTotalCount(sqlcount);   
  22.    records.setTotalNum(total);   
  23. //   records.setParam(condition);  
  24.    String pageSize = RequestUtil.getParam(httpRequest, "pageSize", String.valueOf(PagedList.DEFAULT_PAGE_SIZE));   
  25.    records.setPageSize(Integer.parseInt(pageSize));   
  26.    int totalPage = records.getTotalPage();   
  27.    RequestUtil.setParam(httpRequest, "pageSize", pageSize);   
  28.    //  用自定义的辅助类来取参数值,如果参数为空,则返回指定的默认值  
  29.    String page = RequestUtil.getParam(httpRequest, "page""1");   
  30.    if (Integer.parseInt(page) > totalPage) {   
  31.     page = "" + totalPage;   
  32.    }   
  33.    // 设置请求页码  
  34.    records.setPage(Integer.parseInt(page));   
  35.      //下面创建一个匿名Query实例并调用它的scroll()方法返回以ScrollableResults形式组织的查询结果  
  36.     Query q = session.createQuery(sqllist);   
  37.              q.setFirstResult(records.getQueryStartNum()-1);   
  38.        q.setMaxResults(records.getQueryEndNum());   
  39.        srs = q.scroll();   
  40.              //将查询结果放入List保存  
  41.              while(srs.next()){   
  42.                Class  cl=Class.forName(classname);   
  43.                Constructor cs = cl.getConstructor(partypes);   
  44.                Object ob[]=new Object[partypes.length];   
  45.                for(int i=0;i
  46.                 if (partypes[i] == String.class){   
  47.                  ob[i]=srs.getString(i);   
  48.                 }   
  49.                 else if (partypes[i] ==int.class){   
  50.                   ob[i]=srs.getInteger(i);   
  51.                 }   
  52.                 else if (partypes[i] ==long.class){    
  53.                  ob[i]=srs.getLong(i);   
  54.                 }   
  55.                 else if (partypes[i] ==short.class){    
  56.                  ob[i]=srs.getShort(i);   
  57.                 }   
  58.                 else if (partypes[i] ==float.class){   
  59.                  ob[i]=srs.getFloat(i);   
  60.                 }   
  61.                 else if (partypes[i] ==double.class){   
  62.                  ob[i]=srs.getDouble(i);   
  63.                 }   
  64.                 else if (partypes[i] ==byte.class){   
  65.                  ob[i]=srs.getDouble(i);   
  66.                 }   
  67.                 else if (partypes[i] ==char.class){    
  68.                  ob[i]=srs.getDouble(i);   
  69.                 }   
  70.                 else if (partypes[i] ==boolean.class){   
  71.                  ob[i]=srs.getDouble(i);   
  72.                 }    
  73.                 else if (partypes[i] ==Date.class){   
  74.                  ob[i]=srs.getDate(i);   
  75.                 }    
  76.                }   
  77.                Object ob2 =cs.newInstance(ob);   
  78.                res.add(ob2);   
  79.              }   
  80.              records.setStart(records.getQueryStartNum());   
  81.              records.setSource(res);   
  82.            String url = httpRequest.getRequestURI();   
  83.        String query = CharUtil.IsoToGbk(httpRequest.getQueryString());   
  84.        records.setRequestURL(url + RequestUtil.getParamQueryString(query));   
  85.        //设置分页参数  
  86.        httpRequest.setAttribute("records", records);   
  87.          return records.getList();   
  88.      }  
java 代码
  1. /**  
  2.   *调用方法  
  3.   * 
  4.   */  
  5. public List listTable1()throws DataAccessException, HibernateException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, NoSuchMethodException {   
  6.     String sqlcount="select count(*) from Table1 t, Cclq c where c.ringname=t.name";   
  7.     String sqllist="select t.id,t.name,c.ringname from Table1 t, Cclq c  where c.ringname=t.name";   
  8.     String classname="com.prpsdc.infosystem.model.Test";   
  9.     Class partypes[]=new Class[]{int.class,String.class,String.class};   
  10.     return mutiTableList(sqlcount,sqllist,classname,partypes);   
  11. }  
java 代码
  1. /**
  2. *此类必须有明确的构造函数,如下,mutitablelist方法将通过反射机制将结果映射为此JAVABEAN,以*ArrayList保存.HIbernate的查询结果就是本JAVABEAN的集合.此类无须配置*.HBM.XML
  3. *public Test(int id,String name,String ringname){   }
  4. */
  5. package com.prpsdc.infosystem.model;   
  6.   
  7. public class Test {   
  8. public Test(int id,String name,String ringname){   
  9.     this.id=id;   
  10.     this.name=name;   
  11.     this.ringname=ringname;   
  12. }   
  13. public int id;   
  14. public String name;   
  15. public String ringname;   
  16. public int getId() {   
  17.     return id;   
  18. }   
  19. public void setId(int id) {   
  20.     this.id = id;   
  21. }   
  22. public String getName() {   
  23.     return name;   
  24. }   
  25. public void setName(String name) {   
  26.     this.name = name;   
  27. }   
  28. public String getRingname() {   
  29.     return ringname;   
  30. }   
  31. public void setRingname(String ringname) {   
  32.     this.ringname = ringname;   
  33. }   
  34.   
  35. }   
  36. *
以上的Hibernate分页是我的思想,关于性能方面没有过多的考虑,如果大家有什么建议,给我留言,谢谢!