hibernate中的通用分页basedao

hibernate原生态分页写法

public List<Book> list1(Book book,PageBean pageBean) {
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		String hql="from Book where 1=1";
		if(StringUtils.isNotBlank(book.getBookname())) {
			hql+=" and bookname like :bookname";
		}
		Query query = session.createQuery(hql);
		if(StringUtils.isNotBlank(book.getBookname())) {
			query.setParameter("bookname","%"+book.getBookname()+"%");
			
		}
		if(pageBean!=null && pageBean.isPagination()) {
			query.setFirstResult(pageBean.getStartIndex());
			query.setMaxResults(pageBean.getRows());
		}
		List list = query.list();
		
		transaction.commit();
		session.close();
		return list;
	}

如果表有10个列段,10个都要有query.setParameter
这样对于维护以及后续的改进来说太过繁琐

下面是basedao(不怎么完整的,可继续简化)

package com.util;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.hibernate.Session;
import org.hibernate.query.Query;

/**
 * 分页:
 * 1、hql-->counthql-->total-->pagebean
 * 2、hql-->pagehql-->result(hibernate调用内置接口自动生成分页语句)
 * 
 * @author nie
 *
 */
public class BaseDao {

	private void setParament(Query query,Map<String, Object> map) {
		if(map==null||map.size()==0) {
			return;//直接结束,不返回
		}
		Object value=null;
		//给query赋值
		for (Map.Entry<String, Object> entry : map.entrySet()) {
			value=entry.getValue();
			//对value值是集合的处理方式
			if(value instanceof Collection) {
				query.setParameterList(entry.getKey(),(Collection) value);
			}//value值是数组
			else if(value instanceof Object[]) {
				query.setParameterList(entry.getKey(),(Object[]) value);
			}else {
				query.setParameter(entry.getKey(), value);
			}
		}
	}
	
	private String getCountHql(String hql) {
		int index=hql.toUpperCase().indexOf("FROM");
		return "select count(*)"+hql.substring(index);
	}
	
	public List executeQuery(String hql,PageBean pageBean,Map<String, Object> map,Session session) {
		if(pageBean!=null&&pageBean.isPagination()) {
			String countHql=getCountHql(hql);
			Query countquery = session.createQuery(countHql);
			this.setParament(countquery, map);
			String total = countquery.getSingleResult().toString();
			pageBean.setTotal(total);
			Query pagequery = session.createQuery(hql);
			this.setParament(pagequery, map);
			pagequery.setFirstResult(pageBean.getStartIndex());
			pagequery.setMaxResults(pageBean.getRows());
			return pagequery.list();
		}else {
			Query query = session.createQuery(hql);
			this.setParament(query, map);
			return query.list();
		}
	}
	
}

修改刚才的dao方法

	public List<Book> list2(Book book,PageBean pageBean) {
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		String hql="from Book where 1=1";

		Map<String, Object> map=new HashMap<String, Object>();
		if(StringUtils.isNotBlank(book.getBookname())) {
			hql+=" and bookname like :bookname";
			map.put("bookname","%"+book.getBookname()+"%");
		}
		List list = super.executeQuery(hql, pageBean, map, session);
		
		transaction.commit();
		session.close();
		return list;
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值