package com.baoy.cn.core;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.sql.Connection;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.LockOptions;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert;
/**
* 功能说明 :提供底层数据库操作功能的DAO基类
* creation date: 04-09-2013
*/
@Repository
public abstract class BaseDaoImpl<T extends Serializable> implements BaseDao<T> {
protected Logger log = Logger.getLogger(getClass());
public Connection jdbcConn = null;
public ConnectionProvider cp = null;
protected SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("deprecation")
public Connection getJdbcConnection() throws Exception{
try {
cp = ((SessionFactoryImplementor)this.sessionFactory).getConnectionProvider();
jdbcConn = cp.getConnection();
} catch (Exception e) {
throw e;
}
return jdbcConn;
}
@SuppressWarnings("deprecation")
public void closeJdbcConnection(Connection conn) throws Exception{
try {
if(null!=conn){
if(null!=cp)
cp = ((SessionFactoryImplementor)this.sessionFactory).getConnectionProvider();
cp.closeConnection(conn);
}
} catch (Exception e) {
throw e;
}
}
/**
* 保存对象
* @param entity 实体对象
* @return T 实体对象
*/
public T save(T entity) {
Assert.notNull(entity);
getSession().save(entity);
return entity;
}
/**
* 更新对象
* @param entity 实体对象
* @return Object 实体对象
*/
public Object update(Object entity) {
Assert.notNull(entity);
getSession().update(entity);
return entity;
}
/**
* 修改集合中所有对象
* @param colle 实体集合
* @return void
*/
public void updateAll(Collection<?> colle) {
if (colle != null) {
Iterator<?> it = colle.iterator();
while (it.hasNext()) {
update(it.next());
}
}
}
/**
* 保存或更新对象
* @param entity 实体对象
* @return 实体对象
*/
public Object saveOrUpdate(Object entity) {
Assert.notNull(entity);
getSession().saveOrUpdate(entity);
return entity;
}
/**
* 保存或更新集合中的所有对象
* @param colle 实体对象集合
* @return void
*/
public void saveOrUpdateAll(Collection<?> colle) {
if (colle != null) {
Iterator<?> it = colle.iterator();
while (it.hasNext()) {
saveOrUpdate(it.next());
}
}
}
/**
* 保存集合中所有对象
* @param colle 实体集合
* @return void
*/
public void saveAll(Collection<?> colle) {
if (colle != null) {
Iterator<?> it = colle.iterator();
while (it.hasNext()) {
getSession().save(it.next());
}
}
}
/**
* 保存或更新对象拷贝
* @param entity 待合并的实例
* @return Object 已更新的持久化对象
*/
public Object merge(Object entity) {
Assert.notNull(entity);
return getSession().merge(entity);
}
/**
* 删除对象
* @param entity 实体对象
* @return void
*/
public void delete(Object entity) {
Assert.notNull(entity);
getSession().delete(entity);
}
/**
* 删除集合中所有对象
* @param colle 实体对象列表
* @return void
*/
public void deleteAll(Collection<?> colle) {
if (colle != null) {
Iterator<?> it = colle.iterator();
while (it.hasNext()) {
delete(it.next());
}
}
}
/**
* 根据ID删除记录
* @param id 记录ID
* @return T 删除的对象
*/
public T deleteById(Serializable id) {
Assert.notNull(id);
T entity = load(id);
getSession().delete(entity);
return entity;
}
/**
* 通过ID查找对象
* @param id 记录的ID
* @return 实体对象
*/
public T load(Serializable id) {
Assert.notNull(id);
return load(id, false);
}
/**
* 通过ID查找对象
* @param id 记录的ID
* @return 实体对象
*/
@SuppressWarnings("unchecked")
public T get(Serializable id) {
Assert.notNull(id);
return (T) getSession().get(getPersistentClass(), id);
}
/**
* 通过ID查找对象
* @param id 记录的ID
* @param lock 是否锁定对象
* @return 实体对象
*/
@SuppressWarnings("unchecked")
public T load(Serializable id, boolean lock) {
Assert.notNull(id);
T entity = null;
if (lock) {
entity = (T) getSession().load(getPersistentClass(), id, LockOptions.UPGRADE);
} else {
entity = (T) getSession().load(getPersistentClass(), id);
}
return entity;
}
/**
* 查找所有对象
* @return 对象列表
*/
public List<T> findAll() {
return findByCriteria();
}
/**
* 查找所有对象
* @param orders 查询的排序对象集
* @return 对象列表
*/
@SuppressWarnings("unchecked")
public List<T> findAll(OrderBy... orders) {
Criteria crit = createCriteria();
if (orders != null) {
for (OrderBy order : orders) {
crit.addOrder(order.getOrder());
}
}
return crit.list();
}
/**
* 按HQL查询对象列表.
* @param hql hql语句
* @param values 数量可变的参数
*/
protected List<?> find(String hql, Object... values) {
return createQuery(hql, values).list();
}
/**
* 按HQL查询唯一对象.
* @param hql HQL查询语句
* @param value 参数对应的值列表
* @return Object 泛型实例
*/
protected Object findUnique(String hql, Object... values) {
return createQuery(hql, values).uniqueResult();
}
/**
* 按属性查找对象列表.
* @param property 对象属性
* @param value 对象属性值
* @return List<T> 泛型实例列表
*/
@SuppressWarnings("unchecked")
public List<T> findByProperty(String property, Object value) {
Assert.hasText(property);
return createCriteria(Restrictions.eq(property, value)).list();
}
/**
* 按属性模糊查找对象列表
* @param property 对象属性
* @param value 对象属性值
* @return List<T> 泛型实例列表
*/
@SuppressWarnings("unchecked")
public List<T> findByNotNllProperty(String property,Object value) {
Assert.hasText(property);
return createCriteria(Restrictions.like(property, value)).list();
}
/**
* 按属性查找对象列表,属性必须为NOT NULL
* @param property 对象属性
* @param value 对象属性值
* @return List<T> 泛型实例列表
*/
@SuppressWarnings("unchecked")
public List<T> findByNotNllProperty(String property) {
Assert.hasText(property);
return createCriteria(Restrictions.isNotNull(property)).list();
}
/**
* 按属性查找对象列表,属性必须为NULL
* @param property 对象属性
* @param value 对象属性值
* @return List<T> 泛型实例列表
*/
@SuppressWarnings("unchecked")
public List<T> findByNllProperty(String property) {
Assert.hasText(property);
return createCriteria(Restrictions.isNull(property)).list();
}
/**
* 按属性查找对象列表,属性必须为空字符串
* @param property 对象属性
* @param value 对象属性值
* @return List<T> 泛�