package com.accp.bm.dao;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
@SuppressWarnings("unchecked")
/**
* T extends Serializable T其实就是一个占位符, 你也可以换成其它字母,但作为惯例 当我们需要一种类型时,我们都T来
占位,表示Type ,
* 后面的extends Serializable 表示在实际应用过程中,替换T的类型必须实现Serializable接口. PK => Primary
* Key
*/
public interface BaseDao<T extends Serializable, PK extends Serializable> {
/***************************************************************************
* 新增
**************************************************************************/
/**
* 保存指定实体类
*
* @param entityobj
* 实体类
*/
public Serializable save(T entity);
/***************************************************************************
* 更新
**************************************************************************/
/**
* 更新一个实体
*
* @param t
* 需要更新的实体,须包含主键值
*/
public void update(T t);
/***************************************************************************
* 更新实体 ,通常附加一些更新的条件
*
* @param hql
* 更新的HQL语句
* @param params
* 参数,可有项目或多项目,代替Hql中的"?"号
*/
public void update(final String hql, final Object[] params);
/**
* 更新某个实体的单个属性值
*
* @param entityClass
* 需要更新的实体对象类型
* @param pkName
* 更新对象的主键名称
* @param pkValue
* 待更新对象的主键值
* @param propName
* 待更新的属性名称
* @param propValue
* 待更新的属性值
*/
public void update(Class<T> entityClass, String pkName, Object pkValue,
String propName, Object propValue);
/**
* 更新某个实体的多个属性值
*
* @param entityClass
* 需要更新的实体对象类型
* @param pkName
* 更新对象的主键名称
* @param pkValue
* 待更新对象的主键值
* @param propNames
* 待更新的属性名称数组
* @param propValues
* 待更新的属性值数组
*/
public void update(Class<T> entityClass, String pkName, Object pkValue,
String[] propNames, Object[] propValues);
/**
* 更新或保存指定实体
*
* @param entity
* 实体类
*/
public void saveorupdate(T entity);
/***************************************************************************
* 删除
**************************************************************************/
/**
* 删除指定实体
*
* @param entityobj
* 实体类
*/
public void delete(T entity);
/***************************************************************************
* 删除实体
*
* @param entityClass
* 实体类型信息
* @param id
* 实体的ID
*/
public void deleteById(Class<T> entityClass, PK id);
/**
* 根据多个属性的组合值删除一批对象
*
* @param entityClass
* 对象类型信息
* @param propName
* 参数名称
* @param propValue
* 参数值
*/
public void deleteByProperty(final Class<T> entityClass,
final String propName, final Object propValue);
/**
* 根据多个属性的组合值删除一批对象
*
* @param entityClass
* 对象类型信息
* @param propNames
* 参数名称数组
* @param propValues
* 参数值数组
*/
public void deleteByProperty(final Class<T> entityClass,
final String[] propNames, final Object[] propValues);
/***************************************************************************
* 查询
**************************************************************************/
/**
* 查找指定PK的一个实体类对象
*
* @param entityClass
* 实体Class
* @param id
* 实体PK
* @return 实体对象
*/
public T findEnityById(Class<T> entityClass, PK id);
/**
* 获取所有实体集合
*
* @param entityClass
* 实体类型信息
* @return 查询到的实体对象集合
*/
public List<T> findAll(Class<T> entityClass);
/**
* 升序 查询所有实体集合
*
* @param entityClass
* 实体类型信息
* @return 查询到的实体对象集合
*/
public List<T> findAllAsc(Class<T> entityClass, String orderProperty);
/**
* 降序 查询所有实体集合
*
* @param entityClass
* 实体类型信息
* @return 查询到的实体对象集合
*/
public List<T> findAllDesc(Class<T> entityClass, String orderProperty);;
/**
* 升序/倒序 查询所有实体集合
*
* @param entityClass
* 实体类型信息
* @return 查询到的实体对象集合
*/
public List<T> findAll_order(Class<T> entityClass, String orderProperty,
String orderType);
/*
* 自定义排序 查询所有实体集合
*
* @param entityClass 实体类型信息
*
* @return 查询到的实体对象集合
*/
public List<T> findAll_order(Class<T> entityClass, String orderDesc);
/**
* 查找指定属性的实体集合
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByProperty(Class<T> entityClass, String propertyName,
Object propertyValue);
/**
* 自定义排序查找指定属性的实体集合
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByProperty_order(Class<T> entityClass,
String propertyName, Object propertyValue, String orderDesc);
/**
* 查找指定属性集集(逻辑与)的实体集合
*
* @param entityClass
* 实体
* @param propertyNames
* 属性名数组
* @param propertyValues
* 属性值数组
* @return 实体集合
*/
public List<T> findAllByProperties(Class<T> entityClass,
String[] propertyNames, Object[] propertyValues);
/**
* 查找指定属性集集(逻辑与)的实体集合,并按用户定义的方式排序
*
* @param entityClass
* 实体
* @param propertyNames
* 属性名数组
* @param propertyValues
* 属性值数组
* @return 实体集合
*/
public List<T> findAllByProperties_order(Class<T> entityClass,
String[] propertyNames, Object[] propertyValues, String orderDesc);
/**
* 模糊查找指定属性的实体集合
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByLikeProperty(Class<T> entityClass,
String propertyName, String propertyValue);
/**
* 模糊查找指定属性的实体集合,并按用户定义方式排序
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByLikeProperty_order(Class<T> entityClass,
String propertyName, String propertyValue, String orderDesc);
/**
* 根据HQL语句查询满足要求的所有记录
*
* @param hql
* hql语句
* @param params
* 参数列表
* @return
*/
public List<T> findAllByHQL(final String hql);
/**
* 根据HQL语句查询满足要求的所有记录
*
* @param hql
* hql语句
* @param params
* 参数列表
* @return
*/
public List<T> findAllByHQL(final String hql, final Object[] params);
/**
* 查询所有数据的分页集
*
* @param entityClass
* 实体类型信息
* @param start
* 开始下标
* @param limit
* 每页记录数
*/
public List<T> findAllByPage(Class<T> entityClass, int start, int limit);
/**
* 查询所有数据的分页集,并按用户定义方式排序
*
* @param entityClass
* 实体类型信息
* @param start
* 开始下标
* @param limit
* 每页记录数
*/
public List<T> findAllByPage_order(Class<T> entityClass, String orderDesc,
int start, int limit);
/**
* 分页查找指定属性的实体集合
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByPropertyPage(Class<T> entityClass,
String propertyName, Object propertyValue, int start, int limit);
/**
* 分页查找指定属性的实体集合,并按用户定义方式排序
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByPropertyPage_order(Class<T> entityClass,
String propertyName, Object propertyValue, String orderDesc,
int start, int limit);
/**
* 查找指定属性集集(逻辑与)的实体集合
*
* @param entityClass
* 实体
* @param propertyNames
* 属性名数组
* @param propertyValues
* 属性值数组
* @return 实体集合
*/
public List<T> findAllByPropertiesPage(Class<T> entityClass,
String[] propertyNames, Object[] propertyValues, int start,
int limit);
/**
* 查找指定属性集集(逻辑与)的实体集合,并按用户定义的方式排序
*
* @param entityClass
* 实体
* @param propertyNames
* 属性名数组
* @param propertyValues
* 属性值数组
* @return 实体集合
*/
public List<T> findAllByPropertiesPage_order(Class<T> entityClass,
String[] propertyNames, Object[] propertyValues, String orderDesc,
int start, int limit);
/**
* 分页方式模糊查找指定属性的实体集合
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByLikePropertyPage(Class<T> entityClass,
String propertyName, String propertyValue, int start, int limit);
/**
* 分页方式模糊查找指定属性的实体集合,并按用户指定方式排序
*
* @param entityClass
* 实体
* @param propertyName
* 属性名
* @param value
* 条件
* @return 实体集合
*/
public List<T> findAllByLikePropertyPage_order(Class<T> entityClass,
String propertyName, String propertyValue, String orderDesc,
int start, int limit);
/**
* 有分页支持的HQL查询
*
* @param hql
* 查询用hql语句
* @param params参数列表
* @param start
* 开始下标
* @param limit
* 每页记录数
*/
public List<T> findAllByHQLPage(final String hql, final Object[] params,
final int start, final int limit);
/**
* 获得总的记录数
*
* @param entityClass
* 实体类的类信信息
* @return 该实体所对应的表中的记录总数
*/
public Long getTotalCount(final Class<T> entityClass);
/**
* 带条件的分页记录总数查询
*
* @param hql
* 查询hql语句
* @param params
* 参数列表
* @return 满足该条件的记录总数
*/
public Long getTotalCountByHQL(final String hql, final Object[] params);
/**
* 带条件的分页记录总数查询
*
* @param hql
* 查询hql语句
* @return 满足该条件的记录总数
*/
public Long getTotalCountByHQL(final String hql);
/***************************************************************************
* 以下部分是QBE查询
**************************************************************************/
/**
* 根据模板对象查找对应的所有记录(不分页)
*
* @param entityClass
* 实体类型信息
* @param example
* 查询模板对象
* @return 查询到的记录集
*/
public List<T> findAllByQBE(final Class<T> entityClass, final T example);
/**
* 根据模板对象查找对应的分页记录
*
* @param entityClass
* 实体类型信息
* @param example
* 查询模板对象
* @param start
* 开始记录下标
* @param limit
* 每页记录数
* @return 查询到的分页记录集
*/
public List<T> findAllByQBEPage(final Class<T> entityClass,
final T example, final int start, final int limit);
/**
* 根据模板对象查找对应的记录(含分页和排序)
*
* @param entityClass
* 实体类型信息
* @param example
* 查询模板对象
* @param start
* 开始记录下标
* @param limit
* 每页记录数
* @param orders
* 自定义排序对象数组
* @return 查询到的分页记录集
*/
public List<T> findAllByQBEPage(final Class<T> entityClass,
final T example, final int start, final int limit,
final Order[] orders);
/**
* 查询一个统计函数的结果
*
* @param entityClass
* 实体的类型信息
* @param example
* 模板对象
* @param projection
* 聚合函数对象
* @return
*/
public Object getStatisticalValueByQBE(final Class<T> entityClass,
final T example, final Projection projection);
/**
* 根据模板对象查找对应的记录的总数
*
* @param entityClass
* 实体类型信息
* @param example
* 模板对象
* @return
*/
public Integer getTotalCountByExample(final Class<T> entityClass,
final T example);
/***************************************************************************
* 以下是QBC查询
**************************************************************************/
/**
* 最全的QBC查询基础方法
*
* @param entityClass
* 实体类型信息
* @param start
* 开始下标
* @param limit
* 每页记录数
* @param criterions
* 查询条件数组,由Restrictions对象生成,如Restrictions.like("name","%x%")等;
* @param orders
* 查询后记录的排序条件,由Order对象生成
* @param projs
* 分组和聚合查询条件
* @param isUniqueResult
* 是否返回唯一值
* @return
*/
public Object findAllByQBCPage(final Class<T> entityClass, final int start,
final int limit, final Criterion[] criterions,
final Order[] orders, final Projection[] projs,
final boolean isUniqueResult);
/**
* 用QBC查询满足条件的分页记录(分页、排序)
*
* @param entityClass
* 实体类型信息
* @param start
* 开始下标
* @param limit
* 每页记录数
* @param criterions
* 查询条件数组,由Restrictions对象生成,如Restrictions.like("name","%x%")等;
* @param orders
* 查询后记录的排序条件,由Order对象生成
* @return
*/
public List<T> findAllByQBCPage(final Class<T> entityClass,
final int start, final int limit, final Criterion[] criterions,
final Order[] orders);
/**
* 用QBC查询满足条件的分页记录(分页)
*
* @param entityClass
* 实体类型信息
* @param start
* 开始下标
* @param limit
* 每页记录数
* @param criterions
* 查询条件数组,由Restrictions对象生成,如Restrictions.like("name","%x%")等;
* @return
*/
public List<T> findAllByQBCPage(final Class<T> entityClass,
final int start, final int limit, final Criterion[] criterions);
/**
* 用QBC查询满足条件的所有记录(不分页)
*
* @param entityClass
* 实体类型信息
* @param criterions
* 查询条件数组,由Restrictions对象生成,如Restrictions.like("name","%x%")等;
* @param orders
* 查询后记录的排序条件,由Order对象生成
* @return
*/
public List<T> findAllByQBCPage(final Class<T> entityClass,
final Criterion[] criterions);
/**
* 查询滞QBC条件的记录总数
*
* @param entityClass
* 实体类型信息
* @param criterions
* 查询条件数组,由Restrictions对象生成,如Restrictions.like("name","%x%")等;
* @return
*/
public Integer getTotalCountByQBC(final Class<T> entityClass,
final Criterion[] criterions);
}