package dao.base;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/*解析:
1. 例如: objectDao.queryForCmd("select usercode,passwd,did,pid from s_user t where t.did = 1") 返回的是长度为4的一个数组
2. 例如: SUser user = (SUser) genericDao.queryForCmd("from com.jj.demo.hbm.SUser as u where u.did = 1"); 返回的是SUser对象
3. 例如: objectDao.queryForSingleResultMap("select * from F_D_FILE1 where did = ?",3); 返回单条记录为一个map
4. 例如: objectDao.queryForCmd("from com.jj.demo.hbm.FDFile as fd where fd.fieldname = ?","CREATOR"); 返回为一个FDFile对象
5. 例如: objectDao.findMapListByDynSql("select * from d_file1", -1, -1); 返回为每条记录为一个map的多条记录list
6. 例如: objectDao.queryForCmd("select count(*) from s_all"); 返回为一个结果obj . 可转换为整型
*/
public class GenericBaseDao<T, ID extends Serializable> extends
HibernateDaoSupport implements GenericBaseDaoInter<T, ID> {
@Resource(name = "hibernateTemplate")
// 为父类HibernateDaoSupport注入sessionFactory的值,方法名虽然为setSuperHibernateTemplate(Super),但根据注解实际上就是setHibernateTemplate
// 此处依赖注入与方法名无关,只与方法体有关,不能根据属性注入
public void setSuperHibernateTemplate(HibernateTemplate hibernateTemplate) {
super.setHibernateTemplate(hibernateTemplate);
}
private Class<T> persistentClass = null;
protected Query getQuery(Session session, String cmd) {
Query query;
try {
query = session.getNamedQuery(cmd);// 创建xml中声明的query名称
} catch (HibernateException e) {
try {
query = session.createQuery(cmd);// 否则创建Hibernate的SQL
} catch (HibernateException ex) {
query = session.createSQLQuery(cmd);// 否则创建数据库SQL
}
}
return query;
}
/*
* Cmd parameter is the named query's name. Please refer to Hibernate Named
* Query.
*
* @see com.zybedu.dao.FindCmdDao#findCmd(java.lang.String,
* java.lang.Object[], int, int)
*/
@SuppressWarnings("unchecked")
public List findListByCmd(final String cmd, final int page,
final int count, final Object... params) {
List result = null;
Object o = this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
Query query = getQuery(session, cmd);
if (params != null) {
int len = params.length;
for (int i = 0; i < len; i++) {
query.setParameter(i, params[i]);
}
}
if (page > 0) {
int maxResult = count;
if (count < 1)
maxResult = 1;
int first = (page - 1) * maxResult;
query.setFirstResult(first);
query.setMaxResults(maxResult);
} else {
}
List list = query.list();
org.hibernate.Hibernate.initialize(list);
return list;
}
});
if (o != null)
result = (List) o;
return result;
}
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
this.getSession().flush();
}
@SuppressWarnings("unchecked")
public List<T> findAll() {
List list = this.getHibernateTemplate().loadAll(
this.getPersistentClass());
org.hibernate.Hibernate.initialize(list);
return list;
}
@SuppressWarnings("unchecked")
public T loadObjectById(ID id) {
return (T) this.getHibernateTemplate().get(this.getPersistentClass(),
id);
}
public T saveOrUpdate(T entity) {
this.getHibernateTemplate().saveOrUpdate(entity);
return entity;
}
public T save(T entity) {
this.getHibernateTemplate().save(entity);
return entity;
}
public T update(T entity) {
this.getHibernateTemplate().update(entity);
return entity;
}
public void executeDelOrUpdateHql(final String hql) {
@SuppressWarnings("unused")
Object o = this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
Query query = getQuery(session, hql);
query.executeUpdate();
return null;
}
});
}
@SuppressWarnings("unchecked")
protected Class<T> getPersistentClass() {
if (this.persistentClass == null) {
this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
return this.persistentClass;
}
@SuppressWarnings("unchecked")
public List findMapListByDynSql(String querySql, final int page,
final int count) {
List result = null;
final String fullHql = querySql;
// LazyParser parser=parsers.get(cmd);
if (fullHql != null) {
Object o = this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
Query query = getQuery(session, fullHql);// 创建sql对象
if (page > 0) {
int maxResult = count;
if (count < 1)
maxResult = 1;
int first = (page - 1) * maxResult;
query.setFirstResult(first);
query.setMaxResults(maxResult);
}
return query.setResultTransformer(
Criteria.ALIAS_TO_ENTITY_MAP).list();
}
});
if (o != null)
result = (List) o;
}
return result;
}
public Object queryForCmd(String querySql, final Object... params) {
Object result = null;
final String fullHql = querySql;
// LazyParser parser=parsers.get(cmd);
if (fullHql != null) {
Object o = this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
Query query = getQuery(session, fullHql);
if (params != null) {
int len = params.length;
for (int i = 0; i < len; i++) {
query.setParameter(i, params[i]);
}
}
return query.uniqueResult();
}
});
if (o != null)
result = o;
}
return result;
}
public Object queryForSingleResultMap(String querySql,
final Object... params) {
Object result = null;
final String fullHql = querySql;
// LazyParser parser=parsers.get(cmd);
if (fullHql != null) {
Object o = this.getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
Query query = getQuery(session, fullHql);
if (params != null) {
int len = params.length;
for (int i = 0; i < len; i++) {
query.setParameter(i, params[i]);
}
}
return query.setResultTransformer(
Criteria.ALIAS_TO_ENTITY_MAP)
.uniqueResult();
}
});
if (o != null)
result = o;
}
return result;
}
// 通过属性去查询并返回一个List
@SuppressWarnings("unchecked")
public Object queryByPropertiesMap(Map<String, Object> params) {
// 依赖于hql
Criteria cr = this.getSession().createCriteria(
this.getPersistentClass());
cr.add(Restrictions.allEq(params));
List list = cr.list();
if (list.size() == 1) {
return (T) list.get(0);
}
return (List<T>) list;
}
}
- 1
- 2
- 3
- 4
前往页