package net.techreadiness.persistence.dao; import java.util.Collection; import java.util.List; import javax.persistence.NoResultException; import javax.persistence.TypedQuery; import net.techreadiness.persistence.domain.CustomTextDO; import org.apache.commons.lang3.StringUtils; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; @Repository @Scope("prototype") public class CustomTextDAOImpl extends BaseDAOImpl<CustomTextDO> implements CustomTextDAO { @Override public List<CustomTextDO> findAllCustomTextForScope(Long scopeId) { String query = new StringBuilder().append(" select text ") .append(" from CustomTextDO text, ") .append(" ScopeDO scope, ") .append(" ScopeTreeDO scopeTree ") .append(" where scope.scopeId = :scopeId ") .append(" and scopeTree.scope = scope ") .append(" and scopeTree.ancestorScope = text.scope ") .append(" order by scopeTree.distance desc ").toString(); return em.createQuery(query, CustomTextDO.class).setParameter("scopeId", scopeId) .setHint("org.hibernate.cacheable", Boolean.TRUE).getResultList(); } @Override public CustomTextDO getCustomTextByScopeAndCode(Long scopeId, String code) { String query = new StringBuilder().append(" select text ") .append(" from CustomTextDO text, ") .append(" ScopeDO scope, ") .append(" ScopeTreeDO scopeTree ") .append(" where scope.scopeId = :scopeId ") .append(" and scopeTree.scope = scope ") .append(" and scopeTree.ancestorScope = text.scope ") .append(" and text.code = :code ") .append(" order by scopeTree.distance ") .toString(); try { return em.createQuery(query, CustomTextDO.class).setParameter("scopeId", scopeId).setParameter("code", code) .setMaxResults(1).setHint("org.hibernate.cacheable", Boolean.TRUE).getSingleResult(); } catch (NoResultException e) { return null; } } @Override public Collection<CustomTextDO> findTextForAncestorsAndDescendants(Long scopeId, String key) { StringBuilder sb = new StringBuilder(); sb.append("select text from CustomTextDO text "); sb.append("join text.scope s "); sb.append("join s.scopeTrees st "); sb.append("where (text.scope.scopeId in (select s.scope.scopeId from ScopeTreeDO s where s.ancestorScope.scopeId = :scopeId) "); sb.append("or text.scope.scopeId in (select s.ancestorScope.scopeId from ScopeTreeDO s where s.scope.scopeId = :scopeId)) "); sb.append("and s.scopeId = st.ancestorScope.scopeId "); if (StringUtils.isNotBlank(key)) { sb.append("and text.code = :key "); } sb.append("order by st.depth desc, text.code "); TypedQuery<CustomTextDO> query = em.createQuery(sb.toString(), CustomTextDO.class); query.setParameter("scopeId", scopeId); if (StringUtils.isNotBlank(key)) { query.setParameter("key", key); } return getResultList(query); } }