package somiba.dao;

import java.io.Serializable;
import java.util.List;

import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public abstract class AbstractHibernateDao extends HibernateDaoSupport {

	public void save(Object entity) throws DataAccessException {
		super.getHibernateTemplate().saveOrUpdate(entity);
	}

	protected void delete(Object entity) throws DataAccessException {
		super.getHibernateTemplate().delete(entity);
	}

	protected void deleteById(Class<?> clazz, Serializable id) throws DataAccessException {
		Object entity = super.getHibernateTemplate().load(clazz, id);
		super.getHibernateTemplate().delete(entity); 
	}

	public Object getById(Class<?> clazz, Serializable id) throws DataAccessException {
		Object entity = super.getHibernateTemplate().get(clazz, id);
		return entity;
	}

	protected List<?> findAllByQuery(String hqlQuery, int maxResults, Object... params) throws DataAccessException {
		HibernateTemplate template = super.getHibernateTemplate();
		template.setMaxResults(maxResults);
		List<?> result = template.find(hqlQuery, params);
		return result;
	}

	protected List<?> findAll(String hqlQuery, Object... params) throws DataAccessException {
		List<?> result = super.getHibernateTemplate().find(hqlQuery, params);
		return result;
	}

	protected Object findOne(String hqlQuery, Object... params)	throws DataAccessException {
		List<?> results = super.getHibernateTemplate().find(hqlQuery, params);
		if (results == null || results.isEmpty()) {
			return null;
		}
		// always return first object found
		Object result = results.get(0);
			return result;
	}

}
