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())));
        }
    }

}