package net.changwoo.chat.dao;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* @author JOKe
* @param <E>
* @param <PK>
*/
public abstract class GenericDaoImpl<E, PK extends Serializable> extends
HibernateDaoSupport implements GenericDao<E, PK> {
private static final Logger logger = LoggerFactory
.getLogger(GenericDaoImpl.class);
@SuppressWarnings("unchecked")
protected GenericDaoImpl(SessionFactory sf) {
setSessionFactory(sf);
}
@SuppressWarnings("unchecked")
public PK save(E newInstance) {
return (PK) getHibernateTemplate().save(newInstance);
}
@SuppressWarnings("unchecked")
public E findById(PK id) {
return (E) getHibernateTemplate().get(getEntityClass(), id);
}
@SuppressWarnings("unchecked")
public List<E> findAll() {
return getHibernateTemplate().findByCriteria(createDetachedCriteria());
}
@SuppressWarnings("unchecked")
public List<E> findAllByProperty(String propertyName, Object value) {
DetachedCriteria criteria = createDetachedCriteria();
criteria.add(Restrictions.eq(propertyName, value));
return getHibernateTemplate().findByCriteria(criteria);
}
@SuppressWarnings("unchecked")
public List<E> findAllByProperty(List<Map> list) throws Exception {
DetachedCriteria criteria = createDetachedCriteria();
for(int i=0; i<list.size(); i++){
Map<String, Object> map = (Map<String, Object>) list.get(i);
String propertyName = (String) map.get("propertyName");
Object value = map.get("value");
logger.debug("propertyName "+ propertyName + "value "+ value +" count "+list.size());
criteria.add(Restrictions.eq(propertyName, value));
}
return getHibernateTemplate().findByCriteria(criteria);
}
public List<E> findByExample(E object) {
List<E> resultList = getHibernateTemplate().findByExample(object, 0, 1);
return resultList;
}
public List<E> findByExample(E object, int firstResult, int maxResults) {
List<E> resultList = getHibernateTemplate().findByExample(object,
firstResult, maxResults);
return resultList;
}
public void update(E transientObject) {
getHibernateTemplate().update(transientObject);
}
public void saveOrUpdate(E transientObject) {
getHibernateTemplate().saveOrUpdate(transientObject);
}
public void delete(E persistentObject) {
getHibernateTemplate().delete(persistentObject);
}
protected abstract Class<E> getEntityClass();
protected DetachedCriteria createDetachedCriteria() {
return DetachedCriteria.forClass(getEntityClass());
}
}