PrimeInterestRateRepositoryImpl.java

package com.tradecloud.repository.rate.impl;

import com.tradecloud.domain.PrimeInterestRate;
import com.tradecloud.domain.infrastructure.persistence.CriteriaBuilder;
import com.tradecloud.domain.model.organisationalunit.OrgUnitTraversal;
import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.dto.rate.PrimeInterestRateSearch;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import com.tradecloud.repository.rate.PrimeInterestRateRepository;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

/**
 * Created by ds on 2017/06/12.
 */
@Repository(value = "primeInterestRateRepository")
public class PrimeInterestRateRepositoryImpl<T extends PrimeInterestRate, S extends PrimeInterestRateSearch>
        extends RepositoryBaseImpl<PrimeInterestRate, PrimeInterestRateSearch>
        implements PrimeInterestRateRepository<T, S> {
    @Override
    public PrimeInterestRate findPrimeInterestRateByClosestEffectiveDate(Date currentDate, OrganisationalUnit organisationalUnit) {
        DetachedCriteria criteria = DetachedCriteria.forClass(PrimeInterestRate.class);
        CriteriaBuilder.addDateLessOrEqualRangeCriteria(criteria, "effectiveDate", currentDate);
        Set<OrganisationalUnit> matching = new LinkedHashSet<>();
        OrgUnitTraversal.getAllParentOrgUnits(organisationalUnit, matching);
        criteria.add(Restrictions.in("organisationalUnit",matching));
        criteria.addOrder(Order.desc("effectiveDate")).addOrder(Order.asc("id"));
        List<PrimeInterestRate> primeInterestRateList = getExecutableCriteriaList(criteria, null);
        return (primeInterestRateList.isEmpty() ? null : primeInterestRateList.get(0));
    }
}