package net.techreadiness.persistence.datagrid; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; import net.techreadiness.persistence.domain.ViewDefDO; import net.techreadiness.service.common.DataGrid; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import com.google.common.collect.Lists; @Scope("prototype") @Repository @Transactional(readOnly = true) public class ViewDefByScopeItemProviderImpl implements ViewDefByScopeItemProvider { @PersistenceContext protected EntityManager em; public void setEntityManager(EntityManager em) { this.em = em; } private Long scopeId; public ViewDefByScopeItemProviderImpl() { super(); } @Override public void setScopeId(Long scopeId) { this.scopeId = scopeId; } @Override @Transactional(readOnly = true) public int getTotalNumberOfItems(DataGrid<ViewDefDO> dataGrid) { if (scopeId == null) { return 0; } TypedQuery<Long> query = getFindByScopeIdQueryCount(scopeId); Long count = query.getSingleResult(); return count.intValue(); } @Override @Transactional(readOnly = true) public List<ViewDefDO> getPage(DataGrid<ViewDefDO> dataGrid) { int start = (dataGrid.getPage() - 1) * dataGrid.getPageSize(); if (scopeId == null) { return Lists.newArrayList(); } TypedQuery<ViewDefDO> query = getFindByScopeIdQuery(scopeId); if (dataGrid.isPaging()) { query.setFirstResult(start); query.setMaxResults(dataGrid.getPageSize()); } return Lists.<ViewDefDO> newArrayList(query.getResultList()); } private TypedQuery<ViewDefDO> getFindByScopeIdQuery(final Long scopeId) { StringBuilder sb = new StringBuilder(); sb.append(" select distinct vd "); sb.append(" from ViewDefDO vd"); sb.append(" join vd.scope as s"); sb.append(" join vd.viewDefType as vdt"); sb.append(" join s.scopeTrees as tree"); sb.append(" join s.ancestorScopeTrees as aTree"); sb.append(" where "); sb.append(" tree.ancestorScope.scopeId=:scopeId "); sb.append(" or aTree.scope.scopeId=:scopeId "); TypedQuery<ViewDefDO> query = em.createQuery(sb.toString(), ViewDefDO.class); query.setParameter("scopeId", scopeId); return query; } private TypedQuery<Long> getFindByScopeIdQueryCount(final Long scopeId) { StringBuilder sb = new StringBuilder(); sb.append(" select count(distinct vd) "); sb.append(" from ViewDefDO vd"); sb.append(" join vd.scope as s"); sb.append(" join vd.viewDefType as vdt"); sb.append(" join s.scopeTrees as tree"); sb.append(" join s.ancestorScopeTrees as aTree"); sb.append(" where "); sb.append(" tree.ancestorScope.scopeId=:scopeId "); sb.append(" or aTree.scope.scopeId=:scopeId "); TypedQuery<Long> query = em.createQuery(sb.toString(), Long.class); query.setParameter("scopeId", scopeId); return query; } }