ConsignmentContainerRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.container.ConsignmentContainer;
import com.tradecloud.domain.container.ContainerType;
import com.tradecloud.domain.container.ContainerUsage;
import com.tradecloud.repository.ConsignmentContainerRepository;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Projections;
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;

/**
 * Created by ds on 2016/06/02.
 */
@Repository(value = "consignmentContainerRepository")
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class ConsignmentContainerRepositoryImpl extends RepositoryBaseImplNoSearch<ConsignmentContainer> implements ConsignmentContainerRepository {

    @Override
    public ContainerUsage getContainerUsageById(Long id) {
        String hql = "from ContainerUsage cu where cu.id = :id";
        Query query = getSession().createQuery(hql);
        query.setParameter("id", id);

        return (ContainerUsage) query.uniqueResult();
    }

    @Override
    public ContainerUsage getContainerUsage(Long orderId, String containerTypeCode) {
        String hql = "from ContainerUsage cu where cu.order.id = :id " +
                "and cu.container.containerType.code = :containerTypeCode";
        Query query = getSession().createQuery(hql);
        query.setParameter("id", orderId);
        query.setParameter("containerTypeCode", containerTypeCode);

        return (ContainerUsage) query.uniqueResult();
    }

    @Override
    public List<ContainerType> getContainerTypesFromOrder(String orderNumber) {
        String hql = "select container.containerType from ContainerUsage cu where cu.order.number = :number";
        Query query = getSession().createQuery(hql);
        query.setParameter("number", orderNumber);
        return (List<ContainerType>) query.list();
    }

    @Override
    public ContainerUsage getContainerUsage(String orderNumber, String containerTypeCode) {
        String hql = "from ContainerUsage cu where cu.order.number = :number " +
                "and cu.container.containerType.code = :containerTypeCode";
        Query query = getSession().createQuery(hql);
        query.setParameter("number", orderNumber);
        query.setParameter("containerTypeCode", containerTypeCode);

        return (ContainerUsage) query.uniqueResult();
    }

    /**
     *
     * @param orderId
     * @return
     */
    @Override
    public int getOrderContainerUsageCount(Long orderId) {
        Criteria criteria = getSession().createCriteria(ContainerUsage.class);
        criteria.setProjection(Projections.property("id"));
        criteria.add(Restrictions.eq("order.id", orderId));
        return criteria.list().size();
    }
}