StandardExchangeRateRepositoryImpl.java
package com.tradecloud.repository.impl;
import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.exchangerate.StandardExchangeRate;
import com.tradecloud.dto.rate.StandardExchangeRateSearch;
import com.tradecloud.repository.SearchMetaParams;
import com.tradecloud.repository.StandardExchangeRateRepository;
import com.tradecloud.repository.base.impl.RepositoryBaseImpl;
import org.hibernate.query.Query;
import org.springframework.stereotype.Repository;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author jon
*/
@Repository(value = "standardExchangeRateRepository")
public class StandardExchangeRateRepositoryImpl extends RepositoryBaseImpl<StandardExchangeRate, StandardExchangeRateSearch> implements
StandardExchangeRateRepository {
@Override
public List<StandardExchangeRate> search(StandardExchangeRateSearch search) {
javax.persistence.criteria.CriteriaBuilder cb = getSessionCustom().getCriteriaBuilder();
CriteriaQuery<StandardExchangeRate> cq = cb.createQuery(StandardExchangeRate.class);
Root<StandardExchangeRate> root = cq.from(StandardExchangeRate.class);
// Build predicates using the common method
List<Predicate> predicates = buildPredicates(cb, root, search);
cq.where(predicates.toArray(new Predicate[0]));
cq.orderBy(cb.desc(root.get("effectiveDate")),cb.desc(root.get("created")));
Query<StandardExchangeRate> query = getSessionCustom().createQuery(cq);
SearchMetaParams metaParams = search.getSearchMetaParams();
if (metaParams != null && metaParams.isPaged()) {
query.setFirstResult(metaParams.getRowIndex());
query.setMaxResults(metaParams.getRowCount());
}
return query.getResultList();
}
@Override
public long count(StandardExchangeRateSearch search) {
javax.persistence.criteria.CriteriaBuilder cb = getSessionCustom().getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<StandardExchangeRate> root = cq.from(StandardExchangeRate.class);
// Build predicates using the common method
List<Predicate> predicates = buildPredicates(cb, root, search);
cq.where(predicates.toArray(new Predicate[0]));
cq.select(cb.count(root));
return getSessionCustom().createQuery(cq).getSingleResult();
}
private List<Predicate> buildPredicates(javax.persistence.criteria.CriteriaBuilder cb, Root<StandardExchangeRate> root,
StandardExchangeRateSearch search) {
List<Predicate> predicates = new ArrayList<>();
// Effective Date Range
if (search.getEffectiveDateRange() != null) {
if (search.getEffectiveDateRange().getFrom() != null) {
predicates.add(cb.greaterThanOrEqualTo(root.get("effectiveDate"), search.getEffectiveDateRange().getFrom()));
}
if (search.getEffectiveDateRange().getTo() != null) {
predicates.add(cb.lessThanOrEqualTo(root.get("effectiveDate"), search.getEffectiveDateRange().getTo()));
}
}
// Created Date Range
if (search.getCreatedDateRange() != null) {
if (search.getCreatedDateRange().getFrom() != null) {
predicates.add(cb.greaterThanOrEqualTo(root.get("created"), search.getCreatedDateRange().getFrom()));
}
if (search.getCreatedDateRange().getTo() != null) {
predicates.add(cb.lessThanOrEqualTo(root.get("created"), search.getCreatedDateRange().getTo()));
}
}
// Organisational Unit
if (search.getOrganisationalUnit() != null) {
predicates.add(cb.equal(root.get("organisationalUnit"), search.getOrganisationalUnit()));
}
// Local Currency
if (search.getLocalCurrency() != null) {
predicates.add(cb.equal(root.get("localCurrency"), search.getLocalCurrency()));
}
// Foreign Currency
if (search.getForeignCurrency() != null) {
predicates.add(cb.equal(root.get("foreignCurrency"), search.getForeignCurrency()));
}
if(search.getEffectiveDate()!=null){
predicates.add(cb.equal(root.get("effectiveDate"), search.getEffectiveDate()));
}
if(search.getCreatedDate()!=null){
predicates.add(cb.equal(root.get("created"), search.getCreatedDate()));
}
return predicates;
}
@Override
public StandardExchangeRate searchLatest(StandardExchangeRateSearch search) {
javax.persistence.criteria.CriteriaBuilder cb = getSessionCustom().getCriteriaBuilder();
CriteriaQuery<StandardExchangeRate> cq = cb.createQuery(StandardExchangeRate.class);
Root<StandardExchangeRate> root = cq.from(StandardExchangeRate.class);
List<Predicate> predicates = new ArrayList<>();
// Add predicates (restrictions) based on search criteria
if (search.getEffectiveDate() != null) {
predicates.add(cb.lessThanOrEqualTo(root.get("effectiveDate"), search.getEffectiveDate()));
}
if (search.getOrganisationalUnit() != null) {
predicates.add(cb.equal(root.get("organisationalUnit"), search.getOrganisationalUnit()));
}
if (search.getLocalCurrency() != null) {
predicates.add(cb.equal(root.get("localCurrency"), search.getLocalCurrency()));
}
if (search.getForeignCurrency() != null) {
predicates.add(cb.equal(root.get("foreignCurrency"), search.getForeignCurrency()));
}
// Null check for deletedDate
predicates.add(cb.isNull(root.get("deletedDate")));
// Apply predicates
cq.where(predicates.toArray(new Predicate[0]));
// Add ordering by 'effectiveDate' and 'created'
cq.orderBy(cb.desc(root.get("effectiveDate")), cb.desc(root.get("created")));
// Execute the query
Query<StandardExchangeRate> query = getSessionCustom().createQuery(cq);
List<StandardExchangeRate> results = query.getResultList();
// Return the latest result if found, or null
return results.isEmpty() ? null : results.get(0);
}
private boolean exists(List<? extends PersistenceBase> list, Serializable excludeId) {
if (list.isEmpty()) {
return false;
} else if (list.size() == 1) {
return excludeId != null ? !list.get(0).getId().equals(excludeId) : true;
} else {
// This shouldn't happen
return true;
}
}
@Override
public boolean exists(StandardExchangeRateSearch search, Serializable excludeId) {
search.setSearchMetaParams(new SearchMetaParams(0,2));
return exists(search(search), excludeId);
}
}