package be.mentoringsystems.merke.persistence.hibernate; import be.mentoringsystems.merke.helper.ConversionHelper; import be.mentoringsystems.merke.model.QueryParams; import be.mentoringsystems.merke.model.db.Vendor; import be.mentoringsystems.merke.model.db.Vendorstall; import be.mentoringsystems.merke.persistence.VendorDAO; import java.util.List; import java.util.UUID; import org.apache.commons.lang3.StringUtils; import org.hibernate.SessionFactory; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.MatchMode; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate5.HibernateTemplate; import org.springframework.stereotype.Repository; /** * * @author anthonyarents */ @Repository @SuppressWarnings("unchecked") public class VendorDAOImpl extends HibernateDAO implements VendorDAO { private void initializeDependencies(final HibernateTemplate template, final List list) { for(Vendor obj : list) { initializeDependencies(template, obj); } } private void initializeDependencies(final HibernateTemplate template, final Vendor obj) { template.initialize(obj.getVendorstalls()); for(Vendorstall vendorstall : obj.getVendorstalls()) { template.initialize(vendorstall.getCertificates()); } template.initialize(obj.getRemarks()); } @Autowired public void init(SessionFactory factory) { setSessionFactory(factory); } @Override public void save(Vendor obj) { getHibernateTemplate().saveOrUpdate(obj); } @Override public Vendor getById(UUID id) { final HibernateTemplate template = getHibernateTemplate(); final Vendor result = template.get(Vendor.class, id); initializeDependencies(template, result); return result; } private void addFilters(DetachedCriteria criteria, QueryParams queryParams) { final List years = ConversionHelper.toIntegerList(queryParams.getFilterValue("years")); final List venueIds = ConversionHelper.toUUIDList(queryParams.getFilterValue("venueIds")); final List categories = ConversionHelper.toUUIDList(queryParams.getFilterValue("categoryIds")); final List remarktypes = ConversionHelper.toStringList(queryParams.getFilterValue("remarktypes")); final String search = ConversionHelper.toString(queryParams.getFilterValue("search")); boolean vendorstalljoin = false; if(!StringUtils.isEmpty(search)) { criteria.add(Restrictions.or( Restrictions.ilike("firstname", search, MatchMode.START), Restrictions.ilike("lastname", search, MatchMode.START), Restrictions.ilike("companyName", search, MatchMode.START) )); } if(!venueIds.isEmpty()) { if(!vendorstalljoin) { criteria.createAlias("vendorstalls", "vstall"); vendorstalljoin = true; } criteria.createAlias("vstall.venues", "ven"); criteria.add(Restrictions.in("ven.id", venueIds)); } if(!categories.isEmpty()) { if(!vendorstalljoin) { criteria.createAlias("vendorstalls", "vstall"); vendorstalljoin = true; } criteria.createAlias("vstall.categories", "cat"); criteria.add(Restrictions.in("cat.id", categories)); } if(!remarktypes.isEmpty()) { criteria.createAlias("remarks", "rem"); criteria.add(Restrictions.in("rem.category", remarktypes)); } if(!years.isEmpty()) { final StringBuilder inBuilder = new StringBuilder("YEAR(createdOn) IN (").append(StringUtils.join(years, ",")).append(")"); criteria.add(Restrictions.sqlRestriction(inBuilder.toString())); } } @Override public List getAll(QueryParams queryParams) { final HibernateTemplate template = getHibernateTemplate(); final DetachedCriteria criteria = DetachedCriteria.forClass(Vendor.class); criteria.add(Restrictions.eq("deleted", false)); addFilters(criteria, queryParams); addSorting(criteria, queryParams); final List result = (List) template.findByCriteria(criteria, queryParams.getStart(), queryParams.getLimit()); initializeDependencies(template, result); return result; } @Override public Long getCount(QueryParams queryParams) { final DetachedCriteria criteria = DetachedCriteria.forClass(Vendor.class); criteria.add(Restrictions.eq("deleted", false)); addFilters(criteria, queryParams); criteria.setProjection(Projections.rowCount()); final List result = (List) getHibernateTemplate().findByCriteria(criteria); return result.get(0); } }