package net.techreadiness.persistence.dao; import java.util.ArrayList; import java.util.Collection; import java.util.List; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaBuilder.In; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import net.techreadiness.persistence.domain.OrgTypeDO; import net.techreadiness.persistence.domain.OrgTypeDO_; import net.techreadiness.persistence.domain.ScopeDO_; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @Repository @Scope("prototype") public class OrgTypeDAOImpl extends BaseDAOImpl<OrgTypeDO> implements OrgTypeDAO { @Override public List<OrgTypeDO> findOrgTypesForScope(Long scopeId) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<OrgTypeDO> criteria = cb.createQuery(OrgTypeDO.class); Root<OrgTypeDO> root = criteria.from(OrgTypeDO.class); criteria.where(cb.equal(root.get(OrgTypeDO_.scope).get(ScopeDO_.scopeId), scopeId)); TypedQuery<OrgTypeDO> query = em.createQuery(criteria); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return query.getResultList(); } @Override public OrgTypeDO getByCode(String orgTypeCode, Long scopeId) { StringBuilder sb = new StringBuilder(); TypedQuery<OrgTypeDO> query = null; sb.append(" select ot "); sb.append(" from OrgTypeDO ot"); sb.append(" where ot.code = :orgTypeCode"); sb.append(" and ot.scope.scopeId = :scopeId"); query = em.createQuery(sb.toString(), OrgTypeDO.class); query.setParameter("orgTypeCode", orgTypeCode); query.setParameter("scopeId", scopeId); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return getSingleResult(query); } @Override public List<OrgTypeDO> findChildOrgTypes(Long parentOrgTypeId, Long scopeId) { StringBuilder sb = new StringBuilder(); TypedQuery<OrgTypeDO> query = null; if (parentOrgTypeId == null) { sb.append(" select ot "); sb.append(" from OrgTypeDO ot, ScopeTreeDO st "); sb.append(" where ot.parentOrgType is null"); sb.append(" and ot.scope = st.ancestorScope "); sb.append(" and st.scope.scopeId = :scopeId "); query = em.createQuery(sb.toString(), OrgTypeDO.class); query.setParameter("scopeId", scopeId); } else { sb.append(" select ot "); sb.append(" from OrgTypeDO ot "); sb.append(" where ot.parentOrgType.orgTypeId = :parentOrgTypeId"); query = em.createQuery(sb.toString(), OrgTypeDO.class); query.setParameter("parentOrgTypeId", parentOrgTypeId); } query.setHint("org.hibernate.cacheable", Boolean.TRUE); return getResultList(query); } @Override public List<OrgTypeDO> findOrgTypesByIds(Collection<Long> orgTypeIds) { StringBuilder sb = new StringBuilder(); if (orgTypeIds == null || orgTypeIds.size() == 0) { return new ArrayList<>(); } sb.append(" select ot "); sb.append(" from OrgTypeDO ot "); sb.append(" where ot.orgTypeId in (:orgTypeIds)"); TypedQuery<OrgTypeDO> query = em.createQuery(sb.toString(), OrgTypeDO.class); query.setParameter("orgTypeIds", orgTypeIds); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return getResultList(query); } @Override public List<OrgTypeDO> findOrgTypesForScope(Long scopeId, Collection<String> orgTypeCodes) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<OrgTypeDO> criteria = cb.createQuery(OrgTypeDO.class); Root<OrgTypeDO> root = criteria.from(OrgTypeDO.class); criteria.where(cb.equal(root.get(OrgTypeDO_.scope).get(ScopeDO_.scopeId), scopeId)); In<String> inOrgTypeCode = cb.in(root.get(OrgTypeDO_.code)); if (orgTypeCodes.isEmpty()) { inOrgTypeCode.value((String) null); } else { for (String orgTypeCode : orgTypeCodes) { inOrgTypeCode.value(orgTypeCode); } } criteria.where(inOrgTypeCode); TypedQuery<OrgTypeDO> query = em.createQuery(criteria); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return query.getResultList(); } @Override public List<Long> findDisallowedChildOrgTypeIdsForOrg(Long orgId) { StringBuilder sb = new StringBuilder(); sb.append("select o.orgType.orgTypeId "); sb.append("from OrgTreeDO ot, OrgDO o "); sb.append("where o.orgId = ot.ancestorOrg.orgId "); sb.append("and ot.org.orgId =:orgId "); TypedQuery<Long> query = em.createQuery(sb.toString(), Long.class); query.setParameter("orgId", orgId); query.setHint("org.hibernate.cacheable", Boolean.TRUE); return query.getResultList(); } }