CostLineTemplateRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.costing.CostGroup;
import com.tradecloud.domain.costing.CostLineTemplate;
import com.tradecloud.dto.base.StaticDataSearch;
import com.tradecloud.repository.CostLineTemplateRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.query.Query;
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;

/**
 * Default implementation of the {@link CostLineTemplateRepository} interface.
 *
 * @author ralph
 */
@Repository(value = "costLineTemplateRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class CostLineTemplateRepositoryImpl extends RepositoryBaseImpl<CostLineTemplate, StaticDataSearch> implements CostLineTemplateRepository {

    private static final long serialVersionUID = 1L;
    private final String FIND_REG_NAME_AND_COST_GROUP = """
    SELECT c 
    FROM CostLineTemplate c 
    WHERE c.costGroup = :group 
      AND LOWER(TRIM(c.name)) = LOWER(TRIM(:name))
""";

    @Override
    public List<CostLineTemplate> findByCostGroupOrderByCostLineName(CostGroup costGroup) {
        if (costGroup == null) {
            throw new NullPointerException("Must supply a valid costGroup");
        }
        List<CostLineTemplate> list = (List<CostLineTemplate>) findByNamedQueryAndNamedParam("costLineTemplate.byCostGroupOrderedByCostLineName",
                "costGroup", costGroup);
/*        if (list == null || list.isEmpty()) {
            throw new IllegalStateException("No CostLineTemplates configured for the CostGroup " + costGroup + ".  Please configure and retry.");
        }*/
        return list;
    }

    @Override
    public boolean checkCostLineTemplateExistUsingCode(String code) {
        Criteria searchCriteria = getSessionCustom().createCriteria(CostLineTemplate.class);
        searchCriteria.add(Restrictions.ilike("code", code.trim()));
        @SuppressWarnings("unchecked") CostLineTemplate result = (CostLineTemplate) searchCriteria.uniqueResult();

        if (result != null) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public CostLineTemplate findByCode(String code) {
        Criteria searchCriteria = getSessionCustom().createCriteria(CostLineTemplate.class);
        searchCriteria.add(Restrictions.ilike("code", code.trim()));
        return (CostLineTemplate) searchCriteria.uniqueResult();
    }

    @Override
    public long count(StaticDataSearch search) {
        DetachedCriteria criteria = createCriteria(search);
        return getExecutableCriteriaCount(criteria);
    }

    @Override
    public List<CostLineTemplate> search(StaticDataSearch search) {
        DetachedCriteria criteria = createCriteria(search);
        List<CostLineTemplate> staticDataList = getExecutableCriteriaList(criteria, search.getSearchMetaParams(), "costGroup", true);

        return staticDataList;
    }

    private DetachedCriteria createCriteria(StaticDataSearch search) {
        DetachedCriteria searchCriteria = DetachedCriteria.forClass(CostLineTemplate.class);
        addSearchRestrictions(searchCriteria, search);
        return searchCriteria;
    }

    private void addSearchRestrictions(DetachedCriteria criteria, StaticDataSearch search) {

        if (search.getName() != null && !search.getName().trim().isEmpty()) {
            criteria.add(Restrictions.ilike("name", LIKE + search.getName() + LIKE));
        }

        if (search.getCode() != null && !search.getCode().trim().isEmpty()) {
            criteria.add(Restrictions.ilike("code", LIKE + search.getCode() + LIKE));
        }

    }

    @Override
    public CostLineTemplate findRegNameAndCostGroup(CostGroup costGroup, String name) {
        Query query = getCurrentSession().createQuery(FIND_REG_NAME_AND_COST_GROUP);
        query.setParameter("group", costGroup);
        query.setParameter("name", name);
         query.setMaxResults(1);
        return (CostLineTemplate) query.uniqueResult();
    }
}