package qa.qcri.aidr.trainer.pybossa.dao.impl; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import qa.qcri.aidr.trainer.pybossa.dao.AbstractDao; import java.io.Serializable; import java.util.List; public abstract class AbstractDaoImpl<E, I extends Serializable> implements AbstractDao<E,I> { private Class<E> entityClass; protected AbstractDaoImpl(Class<E> entityClass) { this.entityClass = entityClass; } @Qualifier("sessionFactory") @Autowired private SessionFactory sessionFactory; public Session getCurrentSession() { return sessionFactory.getCurrentSession(); } @Override public E findById(I id) { return (E) getCurrentSession().get(entityClass, id); } @Override public void saveOrUpdate(E e) { getCurrentSession().saveOrUpdate(e); } @Override public void save(E e) { getCurrentSession().save(e); } @Override public void delete(E e) { getCurrentSession().delete(e); } @Override public List<E> findByCriteria(Criterion criterion) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); return criteria.list(); } @Override public List<E> findByCriteria(Criterion criterion, Integer count) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); if(count != null){ criteria.setMaxResults(count); } return criteria.list(); } @Override public E findByCriterionID(Criterion criterion) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); return (E) criteria.uniqueResult(); } /** do not use this method. it is for app live testing **/ @Override public List<E> findAll() { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(Restrictions.eq("status", 1)); criteria.setProjection(Projections.distinct(Projections.property("crisisID"))); return criteria.list(); } @Override public List<E> findUniqueByCriteria(Criterion criterion, String uniqueField) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); criteria.setProjection(Projections.distinct(Projections.property(uniqueField))); return criteria.list(); } @Override public List<E> getMaxOrderByCriteria(Criterion criterion, String orderBy) { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); criteria.addOrder(Order.desc(orderBy)); criteria.setMaxResults(1); return criteria.list(); } }