ServiceFeeRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.model.organisationalunit.OrganisationalUnit;
import com.tradecloud.domain.model.organisationalunit.tradefinance.ServiceFee;
import com.tradecloud.repository.ServiceFeeRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.apache.log4j.Logger;
import org.hibernate.Criteria;
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.Date;
import java.util.List;

/**
 * Created by ds on 2017/06/21.
 */
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
@Repository(value = "serviceFeeRepository")
public class ServiceFeeRepositoryImpl extends RepositoryBaseImpl<ServiceFee, Object> implements ServiceFeeRepository {

    private static Logger log = Logger.getLogger(ServiceFeeRepositoryImpl.class);

    @Override
    public List<ServiceFee> findAllForOrganisationalUnit(OrganisationalUnit organisationalUnit) {
        Criteria searchCriteria = getSessionCustom().createCriteria(ServiceFee.class);
        searchCriteria.add(Restrictions.eq("organisationalUnit", organisationalUnit));
        return searchCriteria.list();
    }

    @Override
    public ServiceFee findFirstAvailableForOrganisationalUnitAndDate(OrganisationalUnit organisationalUnit, Date date) {
        Criteria searchCriteria = getSessionCustom().createCriteria(ServiceFee.class);
        searchCriteria.add(Restrictions.eq("organisationalUnit", organisationalUnit));
        searchCriteria.add(Restrictions.lt("effectiveDate", date));
        searchCriteria.addOrder(org.hibernate.criterion.Order.desc("effectiveDate"));
        List<ServiceFee> serviceFeeList = searchCriteria.list();

        if(serviceFeeList.isEmpty() && organisationalUnit.getParent() != null) {
            return findFirstAvailableForOrganisationalUnitAndDate(organisationalUnit.getParent(), new Date());
        } else {
            return !serviceFeeList.isEmpty() ? serviceFeeList.get(0) : null;
        }
    }
}