package net.techreadiness.persistence.dao;
import java.util.List;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import net.techreadiness.persistence.domain.ContactTypeDO;
import net.techreadiness.persistence.domain.ContactTypeDO_;
import net.techreadiness.persistence.domain.OrgDO;
import net.techreadiness.persistence.domain.OrgDO_;
import net.techreadiness.persistence.domain.OrgPartDO;
import net.techreadiness.persistence.domain.OrgPartDO_;
import net.techreadiness.persistence.domain.ScopeDO;
import net.techreadiness.persistence.domain.ScopeDO_;
import net.techreadiness.persistence.domain.ScopeTreeDO;
import net.techreadiness.persistence.domain.ScopeTreeDO_;
import net.techreadiness.persistence.domain.ScopeTypeDO;
import net.techreadiness.persistence.domain.ScopeTypeDO_;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
@Repository
@Scope("prototype")
public class ContactTypeDAOImpl extends BaseDAOImpl<ContactTypeDO> implements ContactTypeDAO {
@Override
public List<ContactTypeDO> findContactTypesForScope(Long scopeId) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<ContactTypeDO> criteria = cb.createQuery(ContactTypeDO.class);
Root<ContactTypeDO> contactType = criteria.from(ContactTypeDO.class);
Join<ContactTypeDO, ScopeDO> scope = contactType.join(ContactTypeDO_.scope);
Join<ScopeDO, ScopeTypeDO> scopeType = scope.join(ScopeDO_.scopeType);
Join<ScopeDO, ScopeTreeDO> scopeTree = scope.join(ScopeDO_.ancestorScopeTrees);
Predicate typeClause = cb.equal(scopeType.get(ScopeTypeDO_.allowOrg), Short.valueOf("1"));
scopeTree.get(ScopeTreeDO_.scope);
Predicate pathClause = cb.equal(scopeTree.get(ScopeTreeDO_.scope).get(ScopeDO_.scopeId), scopeId);
criteria.where(typeClause, pathClause);
return em.createQuery(criteria).getResultList();
}
@Override
public List<ContactTypeDO> findContactTypesForOrgPart(Long orgPartId) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<ContactTypeDO> criteria = cb.createQuery(ContactTypeDO.class);
Root<OrgPartDO> orgPart = criteria.from(OrgPartDO.class);
Join<OrgPartDO, OrgDO> org = orgPart.join(OrgPartDO_.org);
Join<OrgDO, ScopeDO> scope = org.join(OrgDO_.scope);
Join<ScopeDO, ContactTypeDO> contactType = scope.join(ScopeDO_.contactTypes);
criteria.select(contactType);
Predicate orgPartClause = cb.equal(orgPart.get(OrgPartDO_.orgPartId), orgPartId);
criteria.where(orgPartClause);
return em.createQuery(criteria).getResultList();
}
@Override
public ContactTypeDO getContactType(Long scopeId, String contactTypeCode) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<ContactTypeDO> criteria = cb.createQuery(ContactTypeDO.class);
Root<ContactTypeDO> contactType = criteria.from(ContactTypeDO.class);
Join<ContactTypeDO, ScopeDO> scope = contactType.join(ContactTypeDO_.scope);
Join<ScopeDO, ScopeTypeDO> scopeType = scope.join(ScopeDO_.scopeType);
Join<ScopeDO, ScopeTreeDO> scopeTree = scope.join(ScopeDO_.ancestorScopeTrees);
Predicate typeClause = cb.equal(scopeType.get(ScopeTypeDO_.allowOrg), Short.valueOf("1"));
scopeTree.get(ScopeTreeDO_.scope);
Predicate pathClause = cb.equal(scopeTree.get(ScopeTreeDO_.scope).get(ScopeDO_.scopeId), scopeId);
Predicate contactTypeClause = cb.equal(contactType.get(ContactTypeDO_.code), contactTypeCode);
criteria.where(typeClause, pathClause, contactTypeClause);
return getSingleResult(em.createQuery(criteria));
}
}