CustomsDocumentRepositoryImpl.java

package com.tradecloud.repository.impl;

import com.tradecloud.domain.shipment.clearing.CustomsDocument;
import com.tradecloud.dto.clearing.CustomsDocumentSearch;
import com.tradecloud.repository.CustomsDocumentRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.List;

@Repository
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT)
public class CustomsDocumentRepositoryImpl extends RepositoryBaseImpl<CustomsDocument, CustomsDocumentSearch> implements CustomsDocumentRepository {

    @Override
    public List<CustomsDocument> search(CustomsDocumentSearch search) {
        CriteriaBuilder criteriaBuilder = getSession().getCriteriaBuilder();
        CriteriaQuery<CustomsDocument> criteriaQuery = criteriaBuilder.createQuery(CustomsDocument.class);
        Root<CustomsDocument> c = criteriaQuery.from(CustomsDocument.class);

        Predicate status = criteriaBuilder.equal(c.get("status"), search.getStatus());
        Predicate uploadAttempts = criteriaBuilder.le(c.get("uploadAttempts"), search.getUploadAttempts());
        org.hibernate.query.Query<CustomsDocument> q = getSession().createQuery(criteriaQuery.where(criteriaBuilder.and(status, uploadAttempts)));
        return q.list();
    }
}