All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.wicp.tams.commons.hibernate.service.impl.HbService Maven / Gradle / Ivy

There is a newer version: 2.3.4
Show newest version
package net.wicp.tams.commons.hibernate.service.impl;

import static org.hibernate.criterion.Example.create;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.hibernate.Criteria;
import org.hibernate.LockOptions;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Example.PropertySelector;
import org.hibernate.criterion.Projections;
import org.hibernate.engine.spi.TypedValue;
import org.hibernate.internal.AbstractQueryImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Preconditions;

import net.wicp.tams.commons.hibernate.service.IHbService;
import net.wicp.tams.commons.web.PageAssist;
import net.wicp.tams.commons.web.service.IPageBuild;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class HbService implements IHbService {
	private final Logger logger = LoggerFactory.getLogger(HbService.class);

	private SessionFactory sessionFactory;

	private IPageBuild pageBuild;

	@Override
	public  T findById(Class clazz, Serializable id) {
		return (T) getSession().get(clazz, id);
	}

	@Override
	public void delById(Class clazz, Serializable entityId) {
		Object entity = getSession().get(clazz, entityId);
		Preconditions.checkState(entity != null);
		getSession().delete(entity);
	}

	@Override
	public  void saveOrUpdate(T obj) {
		getSession().saveOrUpdate(obj);
	}

	@Override
	public  void attachLock(T entity) {
		try {
			getSession().buildLockRequest(LockOptions.UPGRADE).lock(entity);
		} catch (RuntimeException re) {
			logger.error("attach failed", re);
			throw re;
		}
	}

	@Override
	public Query getQuery(String hql) {
		return getSession().createQuery(hql);
	}

	@Override
	public Query getQuerySQL(String sql) {
		return getSession().createSQLQuery(sql);
	}

	@Override
	public  List findByExample(T entity, PropertySelector selector) {
		try {
			Example example = create(entity).excludeZeroes();
			if (selector != null) {
				example.setPropertySelector(selector);
			}
			List results = (List) getSession().createCriteria(entity.getClass()).add(example).list();
			return results;
		} catch (RuntimeException re) {
			logger.error("find by example failed", re);
			throw re;
		}
	}

	@Override
	public  List findByExample(T entity, String... excludes) {
		try {
			Example example = create(entity).excludeZeroes();
			if (ArrayUtils.isNotEmpty(excludes)) {
				for (String proName : excludes) {
					example.excludeProperty(proName);
				}
			}
			List results = (List) getSession().createCriteria(entity.getClass()).add(example).list();
			return results;
		} catch (RuntimeException re) {
			logger.error("find by example failed", re);
			throw re;
		}
	}

	@Override
	public PageAssist findByCriteriaPage(Criteria criteria, PageAssist pageAssist) {
		PageAssist pageAssistTrue = pageAssist == null ? pageBuild.build(null) : pageAssist;
		if (pageAssistTrue.getAllNum() < 0) {
			long totalCount = ((Long) criteria.setProjection(Projections.rowCount()).uniqueResult()).longValue();
			pageAssistTrue.setAllNum(totalCount);
			criteria.setProjection(null);
		}

		List retlist = findByCriteriaPage(criteria, pageAssistTrue.getPageNo(), pageAssistTrue.getPageSize());
		pageAssistTrue.setResult(retlist);
		return pageAssistTrue;
	}

	@Override
	public PageAssist findByCriteriaPage(Criteria criteria, HttpServletRequest request) {
		PageAssist init = pageBuild.build(request);
		return findByCriteriaPage(criteria, init);
	}

	@Override
	public PageAssist findByQueryPage(Query queryparam, PageAssist pageAssistparam) {
		PageAssist pageAssistTrue = pageAssistparam == null ? pageBuild.build(null) : pageAssistparam;
		int pageSize = pageAssistTrue.getPageSize();
		int pageNo = pageAssistTrue.getPageNo();
		long allNum = pageAssistTrue.getAllNum();
		Preconditions.checkState(queryparam != null && pageNo > 0 && pageSize > 0);
		AbstractQueryImpl queryAbs = (AbstractQueryImpl) queryparam;

		if (allNum < 0) {// 需要查询记录数
			String queryStr = queryparam.getQueryString();
			int firstIndex = queryStr.indexOf(" from");
			String queryCountSql = "select COUNT(-1)  " + queryStr.substring(firstIndex);
			Query countQuery = getSession().createQuery(queryCountSql);

			try {
				if (ArrayUtils.isNotEmpty(queryAbs.getNamedParameters())) {
					Map paramMap = (Map) PropertyUtils.getProperty(queryAbs,
							"namedParameters");
					for (String paramName : queryAbs.getNamedParameters()) {
						TypedValue tempobj = paramMap.get(paramName);
						countQuery.setParameter(paramName, tempobj.getValue(), tempobj.getType());
					}
				} else {
					List values = (List) PropertyUtils.getProperty(queryAbs, "values");
					for (int i = 0; i < values.size(); i++) {
						countQuery.setParameter(i + 1, values.get(i));
					}
				}
			} catch (Exception e) {
				logger.error("Query在翻页时查询总记录数出错。", e);
			}

			allNum = ((Long) countQuery.uniqueResult()).longValue();
			pageAssistTrue.setAllNum(allNum);
		}
		int startRes = pageSize * (pageNo - 1);
		int endRes = (int) ((allNum > 0 && allNum < pageSize * pageNo) ? allNum : pageSize * pageNo);
		queryparam.setFirstResult(startRes).setMaxResults(endRes);
		List queryList = queryparam.list();
		pageAssistTrue.setResult(queryList);
		return pageAssistTrue;
	}

	@Override
	public PageAssist findByQueryPage(Query queryparam, HttpServletRequest request) {
		PageAssist init = pageBuild.build(request);
		return findByQueryPage(queryparam, init);
	}

	@Override
	public Session getSession() {
		return this.sessionFactory.getCurrentSession();
		// return this.sessionFactory.openSession();
	}

	// ///////////////////////////////////////////////////////////////////////////////
	private final  List findByCriteriaPage(Criteria criteria, int pageNo, int pageSize) {
		Preconditions.checkState(criteria != null && pageNo > 0 && pageSize > 0);
		int min = (pageNo - 1) * pageSize;
		criteria.setFirstResult(min).setMaxResults(pageSize);
		return criteria.list();
	}

	///////////////////////// get/set方法区/////////////////////////////////////

	public SessionFactory getSessionFactory() {
		return sessionFactory;
	}

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

	public IPageBuild getPageBuild() {
		return pageBuild;
	}

	public void setPageBuild(IPageBuild pageBuild) {
		this.pageBuild = pageBuild;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy