使用Criteria进行分页查询通用方法提取

来源:互联网 发布:深圳网络危机公关公司 编辑:程序博客网 时间:2024/05/10 17:25

使用Criteria进行查询操作,无论是分页还是添加查询条件都非常简单,笔者初步研究提取公共方法,以便在项目中方便直接调用

 

通用方法所在的类CommonDaoImpl
package org.t31.carvrol.common.impl;

import java.io.Serializable;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;


import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Order;
import org.t31.carvrol.util.PageResult;


public class CommonDaoImpl {
 private SessionFactory sessionFactory;
 public void setSessionFactory(SessionFactory sessionFactory) {
  this.sessionFactory = sessionFactory;
 }

 
 /**
  * 子类通过此方法获取Criteria,设置查询条件后把Criteria当作参数调用
  *  public PageResult listByPage(Criteria criteria, PageResult pageResult)方法进行分页查询
  * @param clazz
  * @return
  */
 public Criteria getCriteria(Class clazz){
  return sessionFactory.getCurrentSession().createCriteria(clazz);
 }
 
 
 /**
  * 带有查询条件的分页查询
  * @param criteria
  * @param pageResult
  * @return
  */
 public PageResult listByPage(Criteria criteria, PageResult pageResult) {
  if (!pageResult.getOrderBy().equals("")
    && !pageResult.getOrderBy().equals(null)) {
   if ("desc".compareToIgnoreCase(pageResult.getSort()) == 0)
    criteria.addOrder(Order.desc(pageResult.getOrderBy()));
   else {
    criteria.addOrder(Order.asc(pageResult.getOrderBy()));
   }
  }
  int counts = criteria.list().size();
  criteria.setFirstResult(pageResult.getFirstRec());
  criteria.setMaxResults(pageResult.getPageSize());
  pageResult.setList(criteria.list());
  int pageSize = pageResult.getPageSize();
  int pages = getPages(counts, pageSize);
  pageResult.setRecords(counts);
  pageResult.setPages(pages);
  return pageResult;
 }

 
 /*
  * 计算总页数
  */
 private int getPages(int counts, int pageSize) {
  if (counts == 0) {
   return 0;
  } else if (counts <= pageSize) {
   return 1;
  } else if (counts%pageSize!=0) {
   return counts / pageSize + 1;
  } else {
   return counts / pageSize;
  }
 }

 
}

dao层的实现类CustomDaoImpl 继承通用方法所在的类

package org.t31.carvrol.dao.impl;

import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.t31.carvrol.common.impl.CommonDaoImpl;
import org.t31.carvrol.dao.CustomDao;
import org.t31.carvrol.entity.Custom;
import org.t31.carvrol.util.PageResult;

public class CustomDaoImpl extends CommonDaoImpl implements CustomDao  {

 public boolean addCustom(Object o) {
  return super.add(o);
 }

 public boolean delCustom(Class clazz, Serializable id) {
  return super.del(clazz, id);
 }

 public List listCustom(String hql) {
  return super.list(hql);
 }

 public boolean updateCustom(Object o) {
  return super.update(o);
 }

 /**
  * 带有查询条件的分页查询
  */
 public PageResult listByPage(Class clazz, PageResult pageResult,
   Custom custom) {
  Criteria criteria=super.getCriteria(clazz);
  //添加查询条件
  criteria.add(Restrictions.le("cid",7));//小于等于7
  criteria.add(Restrictions.like("ccustomname", "%羊%"));
  
  return super.listByPage(criteria, pageResult);
 }

}


设置分页参数,接收查询结果的类PageResult
package org.t31.carvrol.util;

import java.util.ArrayList;
import java.util.List;

public class PageResult<E> {
 public PageResult(){}
 
 private List<E> list =new ArrayList<E>();
 private int pageNo=1;
 private int pageSize=10; 
 private int records = 0;
 private int pages=1;
 private String orderBy = "";
 private String sort = "asc";
 
 public List<E> getList() {
  return list;
 }
 public void setList(List<E> list) {
  this.list = list;
 }
 public int getPageNo() {
  return pageNo;
 }
 public void setPageNo(int pageNo) {
  this.pageNo = pageNo;
 }
 public int getPageSize() {
  return (pageSize==0)?10:pageSize;
 }
 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }
 public int getRecords(){
  return records;
 }
 public void setRecords(int records){
  this.records=records;
 }
 
 
 public int getFirstRec()
 {
  int ret = (this.getPageNo()-1) * this.getPageSize();
  ret = (ret < 1)?0:ret;
  return ret;
 }
 public String getOrderBy() {
  return orderBy;
 }
 public int getPages() {
  return pages;
 }
 public void setOrderBy(String orderBy) {
  this.orderBy = orderBy;
 }
 public String getSort() {
  return sort;
 }
 public void setSort(String sort) {
  this.sort = sort;
 }
 public void setPages(int pages) {
  this.pages = pages;
 }
 
}


dao的实现类CustomDaoImpl,设置分页查询的参数,调用通用的分页查询方法

package org.t31.carvrol.dao.impl;

import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.t31.carvrol.common.impl.CommonDaoImpl;
import org.t31.carvrol.dao.CustomDao;
import org.t31.carvrol.entity.Custom;
import org.t31.carvrol.util.PageResult;

public class CustomDaoImpl extends CommonDaoImpl implements CustomDao  {

 /**
  * 带有查询条件的分页查询
  */
 public PageResult listByPage(Class clazz, PageResult pageResult,
   Custom custom) {
               PageResult pr=new PageResult();
  //页大小
  pr.setPageSize(2);
  //当前页
  pr.setPageNo(1);
  //根据cid逆序
  pr.setOrderBy("cid");
  pr.setSort("desc");

  //调用父类方法获取Criteria
  Criteria criteria=super.getCriteria(clazz);
  //添加查询条件
  criteria.add(Restrictions.le("cid",7));//小于等于7
  criteria.add(Restrictions.like("ccustomname", "%羊%"));
  
  return super.listByPage(criteria, pageResult);
 } 

}

 

 

原创粉丝点击