📄 hibernategenericdao.java
字号:
package org.langsin.core.dao;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.impl.CriteriaImpl;
import org.hibernate.metadata.ClassMetadata;
import org.langsin.core.dao.support.Page;
import org.langsin.core.utils.BeanUtils;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
/**
* 继承Spring的HibernateDaoSupport,提交多个查询方法,对返回的值做了泛型转换
*
* @author 不落的太阳
*
*/
@SuppressWarnings("unchecked")
public class HibernateGenericDao extends HibernateDaoSupport {
/**
* 根据ID获得对象,调用的load方法,如果对象不存在,抛出异常。
*
* @param <T>
* @param entityClass 实体
* @param id 实体ID
* @return
*/
public <T> T get(Class<T> entityClass, Serializable id) {
return (T) getHibernateTemplate().load(entityClass, id);
}
/**
* 获取全部的对象
*
* @param <T>
* @param entityClass
* @return
*/
public <T> List<T> getAll(Class<T> entityClass) {
return getHibernateTemplate().loadAll(entityClass);
}
/**
* 获取全部对象,带排序功能
*
* @param <T>
* @param entityClass
* 排序的实体
* @param orderBy
* 排序的字段
* @param isAsc
* 升序或是降序
* @return
*/
public <T> List<T> getAll(Class<T> entityClass, String orderBy, boolean isAsc) {
Assert.hasText(orderBy);
if (isAsc)
return getHibernateTemplate().findByCriteria(
DetachedCriteria.forClass(entityClass).addOrder(Order.asc(orderBy)));
else
return getHibernateTemplate().findByCriteria(
DetachedCriteria.forClass(entityClass).addOrder(Order.desc(orderBy)));
}
/**
* 保存对象
*
* @param o
*/
public void save(Object o) {
getHibernateTemplate().saveOrUpdate(o);
}
/**
* 删除对象
*
* @param o
*/
public void remove(Object o) {
getHibernateTemplate().delete(o);
}
/**
* 根据ID删除对象
*
* @param <T>
* @param entityClass
* @param id
*/
public <T> void removeById(Class<T> entityClass, Serializable id) {
remove(get(entityClass, id));
}
public void flush() {
getHibernateTemplate().flush();
}
public void clear() {
getHibernateTemplate().clear();
}
/**
* 创建一个Query对象。可变参数的。方便我们传入所需的参数,没有必须再重载方法了。 调用的方式:dao.createQuery(hql);
* dao.createQuery(hql,arg0); dao.createQuery(hql,arg1,arg2);
* dao.createQuery(hql,new Object[arg0,arg1,arg2]);
*
* @param hql
* @param values
* @return
*/
public Query createQuery(String hql, Object... values) {
Assert.hasText(hql);
Query query = getSession().createQuery(hql);
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
return query;
}
/**
* 创建Criteria对象。可变参数的
*
* @param <T>
* @param entityClass
* @param criterions
* @return
*/
public <T> Criteria createCriteria(Class<T> entityClass, Criterion... criterions) {
Criteria criteria = getSession().createCriteria(entityClass);
for (Criterion c : criterions) {
criteria.add(c);
}
return criteria;
}
/**
* 创建Criteria对象,带排序功能。
*
* @param <T>
* @param entityClass
* @param orderBy
* @param isAsc
* @param criterions
* @return
*/
public <T> Criteria createCriteria(Class<T> entityClass, String orderBy, boolean isAsc, Criterion... criterions) {
Assert.hasText(orderBy);
Criteria criteria = createCriteria(entityClass, criterions);
if (isAsc)
criteria.addOrder(Order.asc(orderBy));
else
criteria.addOrder(Order.desc(orderBy));
return criteria;
}
/**
* 根据hql查询.
*
* @param hql
* @param values
* @return
*/
public List find(String hql, Object... values) {
Assert.hasText(hql);
return getHibernateTemplate().find(hql, values);
}
/**
* 根据属性名和属性值查询对象
*
* @param <T>
* @param entityClass
* @param propertyName
* @param value
* @return
*/
public <T> List<T> findBy(Class<T> entityClass, String propertyName, Object value) {
Assert.hasText(propertyName);
return createCriteria(entityClass, Restrictions.eq(propertyName, value)).list();
}
/**
* 根据属性名和属性值查询对象,带排序功能
*
* @param <T>
* @param entityClass
* @param propertyName
* @param value
* @param orderBy
* @param isAsc
* @return
*/
public <T> List<T> findBy(Class<T> entityClass, String propertyName, Object value, String orderBy, boolean isAsc) {
Assert.hasText(propertyName);
Assert.hasText(orderBy);
return createCriteria(entityClass, orderBy, isAsc, Restrictions.eq(propertyName, value)).list();
}
/**
* 根据属性名和属性值查询对象,返回符合条件的唯一对象。
*
* @param <T>
* @param entityClass
* @param propertyName
* @param value
* @return
* @see removeSelect方法.
* @see removeOrders方法
*/
public <T> T findUniqueBy(Class<T> entityClass, String propertyName, Object value) {
Assert.hasText(propertyName);
return (T) createCriteria(entityClass, Restrictions.eq(propertyName, value)).uniqueResult();
}
/**
* 分页的方法
*
* @param hql
* @param pageNo
* @param pageSize
* @param values
* @return
*/
public Page pagedQuery(String hql, int pageNo, int pageSize, Object... values) {
Assert.hasText(hql);
Assert.isTrue(pageNo >= 1);
// Count查询
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
List countlist = getHibernateTemplate().find(countQueryString, values);
long totalCount = (Long) countlist.get(0);
if (totalCount < 1)
return new Page();
// 实际查询返回分页对象
int startIndex = Page.getStartOfPage(pageNo, pageSize);
Query query = createQuery(hql, values);
List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();
return new Page(startIndex, totalCount, pageSize, list);
}
/**
* 分页查询方法,使用已设好查询条件与排序
*
* @param criteria
* @param pageNo
* @param pageSize
* @return
*/
public Page pagedQuery(Criteria criteria, int pageNo, int pageSize) {
Assert.notNull(criteria);
Assert.isTrue(pageNo >= 1);
CriteriaImpl impl = (CriteriaImpl) criteria;
// 先把Projection和OrderBy条件取出来,清空两者来执行Count操作
Projection projection = impl.getProjection();
List<CriteriaImpl.OrderEntry> orderEntries;
try {
orderEntries = (List) BeanUtils.forceGetProperty(impl, "orderEntries");
BeanUtils.forceSetProperty(impl, "orderEntries", new ArrayList());
} catch (Exception e) {
throw new InternalError("Runtime Exception");
}
// 执行查询
long totalCount = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();
// 将之前的Projection和OrderBy条件重新设回去
criteria.setProjection(projection);
if (projection == null) {
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}
try {
BeanUtils.forceSetProperty(impl, "orderEntries", orderEntries);
} catch (Exception e) {
}
// 返回分页对象
if (totalCount < 1)
return new Page();
int startIndex = Page.getStartOfPage(pageNo, pageSize);
List list = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
return new Page(startIndex, totalCount, pageSize, list);
}
/**
* 分页查询,根据entityClass和查询条件
*
* @param entityClass
* @param pageNo
* @param pageSize
* @param criterions
* @return
*/
public Page pagedQuery(Class entityClass, int pageNo, int pageSize, Criterion... criterions) {
Criteria criteria = createCriteria(entityClass, criterions);
return pagedQuery(criteria, pageNo, pageSize);
}
/**
* 分页查询,根据entityClass和查询条件,排序功能
*
* @param entityClass
* @param pageNo
* @param pageSize
* @param criterions
* @return
*/
public Page pagedQuery(Class entityClass, int pageNo, int pageSize, String orderBy, boolean isAsc,
Criterion... criterions) {
Criteria criteria = createCriteria(entityClass, orderBy, isAsc, criterions);
return pagedQuery(criteria, pageNo, pageSize);
}
/**
* 判断对象某些属性的值在数据库表中是否唯一
*
* @param <T>
* @param entityClass
* @param entity
* @param uniquePropertyNames
* @return
* @see getId
* @see getIdName
*/
public <T> boolean isUnique(Class<T> entityClass, Object entity, String uniquePropertyNames) {
Assert.hasText(uniquePropertyNames);
Criteria criteria = createCriteria(entityClass).setProjection(Projections.rowCount());
String[] nameList = uniquePropertyNames.split(",");
try {
for (String name : nameList) {
criteria.add(Restrictions.eq(name, PropertyUtils.getProperty(entity, name)));
}
String idName = getIdName(entityClass);
Serializable id = getId(entityClass, entity);
if (id != null)
criteria.add(Restrictions.not(Restrictions.eq(idName, id)));
} catch (Exception e) {
ReflectionUtils.handleReflectionException(e);
}
return (Integer) criteria.uniqueResult() == 0;
}
/**
* 取得对象的主键名
*
* @param clazz
* @return
*/
public Serializable getId(Class entityClass, Object entity) throws NoSuchMethodException, IllegalAccessException,
InvocationTargetException {
Assert.notNull(entity);
Assert.notNull(entityClass);
return (Serializable) PropertyUtils.getProperty(entity, getIdName(entityClass));
}
/**
* 取得主键值
*
* @param entityClass
* @param entity
* @return
* @throws Exception
*/
public String getIdName(Class clazz) {
Assert.notNull(clazz);
ClassMetadata meta = getSessionFactory().getClassMetadata(clazz);
Assert.notNull(meta);
String idName = meta.getIdentifierPropertyName();
Assert.hasText(idName);
return idName;
}
/**
* 去除hql的orderby子句
*
* @param hql
* @return
*/
private static String removeSelect(String hql) {
Assert.hasText(hql);
int beginPos = hql.toLowerCase().indexOf("from");
Assert.isTrue(beginPos != -1);
return hql.substring(beginPos);
}
private static String removeOrders(String hql) {
Assert.hasText(hql);
Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(hql);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "");
}
m.appendTail(sb);
return sb.toString();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -