使用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);
}
}