package com.salesmanager.core.business.repositories.customer; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.apache.commons.lang3.StringUtils; import com.salesmanager.core.model.customer.CustomerCriteria; import com.salesmanager.core.model.customer.CustomerList; import com.salesmanager.core.model.merchant.MerchantStore; public class CustomerRepositoryImpl implements CustomerRepositoryCustom { @PersistenceContext private EntityManager em; @SuppressWarnings("unchecked") @Override public CustomerList listByStore(MerchantStore store, CustomerCriteria criteria) { CustomerList customerList = new CustomerList(); StringBuilder countBuilderSelect = new StringBuilder(); StringBuilder objectBuilderSelect = new StringBuilder(); String baseCountQuery = "select count(c) from Customer as c"; String baseQuery = "select c from Customer as c"; countBuilderSelect.append(baseCountQuery); objectBuilderSelect.append(baseQuery); StringBuilder countBuilderWhere = new StringBuilder(); StringBuilder objectBuilderWhere = new StringBuilder(); String whereQuery = " where c.merchantStore.id=:mId"; countBuilderWhere.append(whereQuery); objectBuilderWhere.append(whereQuery); if(!StringUtils.isBlank(criteria.getName())) { String nameQuery =" and c.billing.firstName like:nm or c.billing.lastName like:nm"; countBuilderWhere.append(nameQuery); objectBuilderWhere.append(nameQuery); } if(!StringUtils.isBlank(criteria.getFirstName())) { String nameQuery =" and c..billing.firstName like:fn"; countBuilderWhere.append(nameQuery); objectBuilderWhere.append(nameQuery); } if(!StringUtils.isBlank(criteria.getLastName())) { String nameQuery =" and c.billing.lastName like:ln"; countBuilderWhere.append(nameQuery); objectBuilderWhere.append(nameQuery); } if(!StringUtils.isBlank(criteria.getEmail())) { String mailQuery =" and c.emailAddress like:email"; countBuilderWhere.append(mailQuery); objectBuilderWhere.append(mailQuery); } if(!StringUtils.isBlank(criteria.getCountry())) { String countryQuery =" and c.billing.country.isoCode like:country"; countBuilderWhere.append(countryQuery); objectBuilderWhere.append(countryQuery); } //count query Query countQ = em.createQuery( countBuilderSelect.toString() + countBuilderWhere.toString()); //object query Query objectQ = em.createQuery( objectBuilderSelect.toString() + objectBuilderWhere.toString()); countQ.setParameter("mId", store.getId()); objectQ.setParameter("mId", store.getId()); if(!StringUtils.isBlank(criteria.getName())) { String nameParam = new StringBuilder().append("%").append(criteria.getName()).append("%").toString(); countQ.setParameter("nm",nameParam); objectQ.setParameter("nm",nameParam); } if(!StringUtils.isBlank(criteria.getFirstName())) { String nameParam = new StringBuilder().append("%").append(criteria.getFirstName()).append("%").toString(); countQ.setParameter("fn",nameParam); objectQ.setParameter("fn",nameParam); } if(!StringUtils.isBlank(criteria.getLastName())) { String nameParam = new StringBuilder().append("%").append(criteria.getLastName()).append("%").toString(); countQ.setParameter("ln",nameParam); objectQ.setParameter("ln",nameParam); } if(!StringUtils.isBlank(criteria.getEmail())) { String email = new StringBuilder().append("%").append(criteria.getEmail()).append("%").toString(); countQ.setParameter("email",email); objectQ.setParameter("email",email); } if(!StringUtils.isBlank(criteria.getCountry())) { String country = new StringBuilder().append("%").append(criteria.getCountry()).append("%").toString(); countQ.setParameter("country",country); objectQ.setParameter("country",country); } Number count = (Number) countQ.getSingleResult(); customerList.setTotalCount(count.intValue()); if(count.intValue()==0) return customerList; //TO BE USED int max = criteria.getMaxCount(); int first = criteria.getStartIndex(); objectQ.setFirstResult(first); if(max>0) { int maxCount = first + max; if(maxCount < count.intValue()) { objectQ.setMaxResults(maxCount); } else { objectQ.setMaxResults(count.intValue()); } } customerList.setCustomers(objectQ.getResultList()); return customerList; } }