GenericHibernateDAOCrud 【收藏】

public class RegionDAOImpl extends GenericHibernateDAOCrud<Region> implements IRegionDAO {
中的GenericHibernateDAOCrud在那里呀!谢谢了!


GenericHibernateDAOCrud 这个类可以提供给你。它在DAO层对Hibernate增、删、改、查的基类支持。也就是我文章中提到的DAO模式。
package com.ssgly.dao;

 
import java.io.Serializable;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.*;

import com.ssgly.model.*;

import org.apache.commons.logging.*;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.dao.DataRetrievalFailureException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * This base class is prepared for subclass to do CRUD easily.
 * 
 * @author Tiger
 */
public abstract class GenericHibernateDAOCrud<T> {

    protected static final Object[] EMPTY_OBJECT_ARRAY = new Object[] {};

    protected Log log = LogFactory.getLog(getClass());

    private final Class<T> clazz;
    protected HibernateTemplate hibernateTemplate;

    /**
     * Inject domain's class type in constructor.
     * 
     * @param clazz Domain's class.
     */
    public GenericHibernateDAOCrud(Class<T> clazz) {
        this.clazz = clazz;
    }

    /**
     * @spring.property name="hibernateTemplate" ref="hibernateTemplate"
     */
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }

    @SuppressWarnings("unchecked")
    public T query(Serializable id) {
        T t = (T)hibernateTemplate.get(clazz, id);
        if(t==null)
            throw new DataRetrievalFailureException("Object not found.");
        // it is strange that load() method return a lazy-loading proxy object 
        // and it may cause LazyInitializationException!
        return t;
    }

    /**
     * Default implementation of creating new domain object.
     */
    public void create(T t) {
        hibernateTemplate.save(t);
    }

    /**
     * Default implementation of deleting new domain object.
     */
    public void delete(T t) {
        hibernateTemplate.delete(t);
    }

    /**
     * Default implementation of updating domain object.
     */
    public void update(T t) {
        hibernateTemplate.update(t);
    }

    /**
     * Do an update hql query, return the affected rows.
     * 
     * @param updateHql Update HQL.
     * @param values Parameters or null if none.
     * @return The affected rows.
     */
    protected int executeUpdate(final String updateHql, final Object[] values) {
        HibernateCallback updateCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) throws HibernateException, SQLException {
                Query query = session.createQuery(updateHql);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return new Integer(query.executeUpdate());
            }
        };
        return ((Integer)hibernateTemplate.execute(updateCallback)).intValue();
    }

    /**
     * Prepared for sub-class for convenience. Query for list and also return 
     * total results' number.
     * 
     * @param selectCount HQL for "select count(*) from ..." and should return a Long.
     * @param select HQL for "select * from ..." and should return object list.
     * @param values For prepared statements.
     * @param page Page object for store page information.
     */
    protected List queryForList(final String selectCount, final String select, final Object[] values, final Page page) {
        Long count = (Long)queryForObject(selectCount, values);
        page.setTotalCount(count.intValue());
        if(page.isEmpty())
            return Collections.EMPTY_LIST;
        return queryForList(select, values, page);
    }

    /**
     * Prepared for sub-class for convenience. Query for list but do not return 
     * total results' number.
     * 
     * @param select HQL for "select * from ..." and should return object list.
     * @param values For prepared statements.
     * @param page Page object for store page information.
     */
    protected List queryForList(final String select, final Object[] values, final Page page) {
        // select:
        HibernateCallback selectCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                Query query = session.createQuery(select);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return query.setFirstResult(page.getFirstResult())
                            .setMaxResults(page.getPageSize())
                            .list();
            }
        };
        return (List) hibernateTemplate.executeFind(selectCallback);
    }

    /**
     * Prepared for sub-class for convenience. Query for unique result.
     * 
     * @param select HQL for "select * from ..." and should return unique object.
     * @param values For prepared statements.
     */
    protected Object queryForObject(final String select, final Object[] values) {
        HibernateCallback selectCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                Query query = session.createQuery(select);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return query.uniqueResult();
            }
        };
        return hibernateTemplate.execute(selectCallback);
    }

    protected Object queryForObject(final DetachedCriteria dc) {
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                return dc.getExecutableCriteria(session).uniqueResult();
            }
        };
        return hibernateTemplate.execute(callback);
    }

    

    /**
     * Prepared for sub-class for convenience.
     */
    protected Object uniqueResult(final DetachedCriteria dc) {
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                return dc.getExecutableCriteria(session).uniqueResult();
            }
        };
        return hibernateTemplate.execute(callback);
    }
    protected List queryForLists(final String select, final Object[] values) {
        // select:
        HibernateCallback selectCallback = new HibernateCallback() {
            public Object doInHibernate(Session session) {
                Query query = session.createQuery(select);
                if(values!=null) {
                    for(int i=0; i<values.length; i++)
                        query.setParameter(i, values[i]);
                }
                return query.list();
            }
        };
        return (List) hibernateTemplate.executeFind(selectCallback);
    }

}

/***************************应用******************************************/
public class RegionDAOImpl extends GenericHibernateDAOCrud<Region> implements IRegionDAO {
    
	public RegionDAOImpl(){
		
		super(Region.class);
	}

	public void deleteRegion(Region region) {
		hibernateTemplate.delete(region);
		
	}

	public void deleteRegion(Long id) {
		hibernateTemplate.delete(hibernateTemplate.get(Region.class, id));
		
	}

	public Region getRegion(Long id) {
		 
		return (Region)hibernateTemplate.get(Region.class, id);
	}

	public Long saveRegion(Region region) {
		hibernateTemplate.save(region);
		return region.getId();
	}

	public void updateRegion(Region region) {
		
		hibernateTemplate.saveOrUpdate(region);
	}
	
	/**
	 * 查询父节点的所有子节点
	 * @param parent   父节点
	 * @return  该父节点对应的子节点
	 * 
	 * 
	 **/
	public List<Region> listRegionByParent(Region parent) {
		 if (parent==null){
			 return (List<Region>)hibernateTemplate.find("from Region as r where r.parent is null"); 
		 }else{
			 return (List<Region>)queryForLists("from Region as r where r.parent=?"
		     			 ,new Object[]{parent});
		     
		 }
	    
	}

	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值