CompanySearchRepositoryImpl.java
package com.tradecloud.repository.company;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.domain.party.ServiceProvider;
import com.tradecloud.domain.party.base.Company;
import com.tradecloud.dto.company.CompanyDomainSearch;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.apache.log4j.Logger;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Repository(value = "companySearchRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class CompanySearchRepositoryImpl extends RepositoryBaseImpl<Company, CompanyDomainSearch> implements CompanySearchRepository {
private static final long serialVersionUID = 1L;
private static final Logger log = Logger.getLogger(CompanySearchRepositoryImpl.class);
@SuppressWarnings("unchecked")
@Override
public List<Company> search(CompanyDomainSearch search) {
DetachedCriteria criteria = null;
try {
criteria = DetachedCriteria.forClass(Class.forName(search.getTableName()));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
addSearchRestrictions(criteria, search);
return getExecutableCriteriaList(criteria, search.getSearchMetaParams(), "name", true);
}
@SuppressWarnings("unchecked")
@Override
public long countByCriteria(CompanyDomainSearch search) {
DetachedCriteria criteria = null;
long count = 0;
try {
criteria = DetachedCriteria.forClass(Class.forName(search.getTableName()));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
addSearchRestrictions(criteria, search);
return getExecutableCriteriaCount(criteria);
}
private void addSearchRestrictions(DetachedCriteria criteria, CompanyDomainSearch search) {
log.debug("addSearchRestrictions " + search.toString());
CriteriaBuilder.addEqRestriction(criteria, "active", search.getActive());
if(search.getTableName()!=null && search.getTableName().equals(ServiceProvider.class.getName())) {
CriteriaBuilder.addEqRestriction(criteria, "costCompareOnly", search.isCostCompareOnly());
}
if (search.getName() != null && search.getName().trim().length() > 0) {
criteria.add(Restrictions.ilike("name", LIKE + search.getName() + LIKE));
}
if (search.getExternalReference() != null && search.getExternalReference().trim().length() > 0) {
criteria.add(Restrictions.ilike("externalReference", LIKE + search.getExternalReference() + LIKE));
}
if(search.getOrganisationalUnit()!=null) {
criteria.add(Restrictions.sqlRestriction(String.format("(select count(*) from organisationalunit_serviceprovider where " +
"serviceproviders_id={alias}.id and organisationalunit_id=%s )>0",search.getOrganisationalUnit().getId())));
}
if(search.getServiceProviderType()!=null){
criteria.add(Restrictions.sqlRestriction(String.format("(select count(*) from serviceprovider_serviceprovidertypes where " +
"serviceprovider_id={alias}.id and serviceprovidertype='%s' )>0",search.getServiceProviderType().name())));
}
}
}