package qa.qcri.aidr.dao; import java.io.Serializable; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.LockOptions; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.CriteriaSpecification; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.springframework.beans.factory.annotation.Autowired; public abstract class AbstractDao<E, I extends Serializable> { private final Class<E> entityClass; protected AbstractDao(Class<E> entityClass) { this.entityClass = entityClass; } private static Logger logger = Logger.getLogger(AbstractDao.class); @Autowired private SessionFactory sessionFactory; public Session getCurrentSession() { return sessionFactory.getCurrentSession(); } public E findById(I id) { return (E) getCurrentSession().get(entityClass, id); } public void saveOrUpdate(E e) { Session session = getCurrentSession(); session.saveOrUpdate(e); } public void saveOrMerge(E e) { Session session = getCurrentSession(); session.merge(e); } public Serializable save(E e) { Session session = getCurrentSession(); return session.save(e); } @SuppressWarnings("unchecked") public List findAll() { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.setProjection(Projections.distinct(Projections.property("id"))); try { List result = criteria.list(); //System.out.println("result = " + result); return result; } catch (HibernateException e) { logger.error("Error in findAll().",e); return null; } } public void delete(E e) { Session session = getCurrentSession(); session.buildLockRequest(LockOptions.UPGRADE).lock(e); session.delete(e); } @SuppressWarnings("unchecked") public List<E> findByCriteria(Criterion criterion) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); try { return criteria.list(); } catch (HibernateException e) { logger.error("Error in findByCriteria for criteria : " + criteria.toString(),e); return null; } } @SuppressWarnings("unchecked") public List<E> getMaxOrderByCriteria(Criterion criterion, String orderBy) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); criteria.addOrder(Order.desc(orderBy)); criteria.setMaxResults(1); try { return criteria.list(); } catch (HibernateException e) { logger.error("Error in getMaxOrderByCriteria for criteria : " + criteria.toString(),e); return null; } } @SuppressWarnings("unchecked") public List<E> findByCriteriaByOrder(Criterion criterion, String[] orderBy, Integer count) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); for(int i = 0; i< orderBy.length; i++){ criteria.addOrder(Order.desc(orderBy[i])); } if(count != null){ criteria.setMaxResults(count); } try { return criteria.list(); } catch (HibernateException e) { logger.error("Error in findbyCriteriaByOrder for criteria : " + criteria.toString(),e); return null; } } @SuppressWarnings("unchecked") public List<E> findByCriteriaWithAliasByOrder(Criterion criterion, String[] orderBy, Integer count, String aliasTable, Criterion aliasCriterion) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); criteria.createAlias(aliasTable, aliasTable, CriteriaSpecification.LEFT_JOIN).add(aliasCriterion); for(int i = 0; i< orderBy.length; i++){ criteria.addOrder(Order.desc(orderBy[i])); } if(count != null){ criteria.setMaxResults(count); } try { return criteria.list(); } catch (HibernateException e) { logger.error("Error in findByCriteriaWithAliasByOrder for criteria : " + criteria.toString(),e); return null; } } @SuppressWarnings("unchecked") public List<E> findByCriteria(Criterion criterion, Integer count) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); if(count != null){ criteria.setMaxResults(count); } try { return criteria.list(); } catch (HibernateException e) { logger.error("Error in findByCriteria for criteria : " + criteria.toString(),e); return null; } } @SuppressWarnings("unchecked") public E findByCriterionID(Criterion criterion) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); try { return (E) criteria.uniqueResult(); } catch (HibernateException e) { logger.error("Error in findByCriterionID for criteria : " + criteria.toString(),e); return null; } } }