package net.techreadiness.persistence.dao; import java.util.List; import javax.persistence.TypedQuery; 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.EntityDO; import net.techreadiness.persistence.domain.EntityDO_; import net.techreadiness.persistence.domain.EntityFieldDO; import net.techreadiness.persistence.domain.EntityFieldDO_; import net.techreadiness.persistence.domain.EntityTypeDO_; import net.techreadiness.persistence.domain.ScopeDO_; import org.springframework.stereotype.Repository; @Repository public class EntityFieldDAOImpl extends BaseDAOImpl<EntityFieldDO> implements EntityFieldDAO { @Override public List<EntityFieldDO> findByScopePathAndType(Long scopeId, EntityDAO.EntityTypeCode typeCode) { // StringBuilder sb = new StringBuilder(); // sb.append(" select ef "); // sb.append(" from EntityFieldDO ef"); // sb.append(" where ef.entity = ( "); StringBuilder sb = new StringBuilder(); sb.append("select e "); sb.append("from EntityDO e, ScopeTreeDO tree, EntityTypeDO et "); sb.append("where e.scope = tree.ancestorScope "); sb.append(" and tree.scope.scopeId =:scopeId "); sb.append(" and e.entityType.entityTypeId = et.entityTypeId "); sb.append(" and et.code =:typeCode "); sb.append(" order by tree.distance asc"); TypedQuery<EntityDO> query = em.createQuery(sb.toString(), EntityDO.class); query.setParameter("scopeId", scopeId); query.setParameter("typeCode", typeCode.toString()); query.setMaxResults(1); EntityDO entityDO = getSingleResult(query); sb = new StringBuilder(); sb.append(" select ef "); sb.append(" from EntityFieldDO ef"); sb.append(" where ef.entity = :entity "); TypedQuery<EntityFieldDO> q2 = em.createQuery(sb.toString(), EntityFieldDO.class); q2.setParameter("entity", entityDO); // query.setHint("org.hibernate.cacheable", Boolean.TRUE); return getResultList(q2); } @Override public EntityFieldDO findByScopeAndTypeAndCode(Long scopeId, EntityDAO.EntityTypeCode type, String code) { StringBuilder sb = new StringBuilder(); sb.append(" select ef "); sb.append(" from EntityFieldDO ef, ScopeTreeDO tree "); sb.append(" where ef.entity.scope = tree.ancestorScope"); sb.append(" and tree.scope.scopeId=:scopeId "); sb.append(" and ef.entity.entityType.code=:typeCode "); sb.append(" and ef.code=:code "); sb.append(" order by ef.displayOrder, ef.name, tree.distance asc"); TypedQuery<EntityFieldDO> query = em.createQuery(sb.toString(), EntityFieldDO.class); query.setParameter("scopeId", scopeId); query.setParameter("typeCode", type.toString()); query.setParameter("code", code); query.setHint("org.hibernate.cacheable", Boolean.TRUE); query.setMaxResults(1); return getSingleResult(query); } @Override public void setOptionListIdToNull(Long optionListId) { List<EntityFieldDO> entityFields = getEntityFieldsByOptionListId(optionListId); for (EntityFieldDO ef : entityFields) { ef.setOptionList(null); update(ef); } } private List<EntityFieldDO> getEntityFieldsByOptionListId(Long optionListId) { StringBuilder sb = new StringBuilder(); sb.append("select ef "); sb.append("from EntityFieldDO ef "); sb.append("where ef.optionList.optionListId=:optionListId "); TypedQuery<EntityFieldDO> query = em.createQuery(sb.toString(), EntityFieldDO.class); query.setParameter("optionListId", optionListId); return getResultList(query); } @Override public EntityFieldDO getRootFieldDefinition(Long entityTypeId, String code) { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<EntityFieldDO> query = cb.createQuery(EntityFieldDO.class); Root<EntityFieldDO> entityField = query.from(EntityFieldDO.class); Join<EntityFieldDO, EntityDO> entity = entityField.join(EntityFieldDO_.entity); Predicate entityType = cb.equal(entity.get(EntityDO_.entityType).get(EntityTypeDO_.entityTypeId), entityTypeId); Predicate fieldCode = cb.equal(entityField.get(EntityFieldDO_.code), code); Predicate nullParent = cb.isNull(entity.get(EntityDO_.scope).get(ScopeDO_.parentScope)); query.where(entityType, fieldCode, nullParent); return getSingleResult(em.createQuery(query)); } }