Newer
Older
alarm / src / com / casic / core / hibernate / HibernatePagingDao.java
zhout on 2 Mar 2022 5 KB first commit
 package com.casic.core.hibernate;
 
 import com.casic.core.page.Page;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Projection;
import org.hibernate.internal.CriteriaImpl;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
 
 public class HibernatePagingDao extends HibernateGenericDao
 {
   public HibernatePagingDao()
   {
   }
 
   public HibernatePagingDao(SessionFactory sessionFactory)
   {
     super(sessionFactory);
   }
 
   @Transactional(readOnly=true)
   public Page pagedQuery(String hql, int pageNo, int pageSize, Object[] values)
   {
     Assert.hasText(hql);
     Assert.isTrue(pageNo >= 1, "pageNo should be eg 1");
 
     String countQueryString = "select count (*) " + HibernateUtils.removeSelect(HibernateUtils.removeOrders(hql));
 
     Integer totalCount = getCount(countQueryString, values);
 
     if (totalCount.intValue() < 1) {
       return new Page();
     }
 
     Query query = createQuery(hql, values);
     int start = (pageNo - 1) * pageSize;
     List result = query.setFirstResult(start).setMaxResults(pageSize).list();
 
     Page page = new Page(result, totalCount.intValue());
     page.setPageNo(pageNo);
     page.setPageSize(pageSize);
 
     return page;
   }
 
   @Transactional(readOnly=true)
   public Page pagedQuery(String hql, int pageNo, int pageSize, Map<String, Object> map)
   {
     Assert.hasText(hql);
     Assert.isTrue(pageNo >= 1, "pageNo should be eg 1");
 
     String countQueryString = "select count (*) " + HibernateUtils.removeSelect(HibernateUtils.removeOrders(hql));
 
     Integer totalCount = getCount(countQueryString, map);
 
     if (totalCount.intValue() < 1) {
       return new Page();
     }
 
     Query query = createQuery(hql, map);
     int start = (pageNo - 1) * pageSize;
     List result = query.setFirstResult(start).setMaxResults(pageSize).list();
 
     Page page = new Page(result, totalCount.intValue());
     page.setPageNo(pageNo);
     page.setPageSize(pageSize);
 
     return page;
   }
 
   @Transactional(readOnly=true)
   public Page pagedQuery(Criteria criteria, int pageNo, int pageSize)
   {
     Assert.notNull(criteria);
     Assert.isTrue(pageNo >= 1, "pageNo should be eg 1");
     Assert.isTrue(criteria instanceof CriteriaImpl);
 
     Projection projection = HibernateUtils.findProjection(criteria);
 
     List orderEntries = HibernateUtils.findOrderEntries(criteria);
     HibernateUtils.setOrderEntries(criteria, Collections.EMPTY_LIST);
 
     Integer totalCount = getCount(criteria);
 
     criteria.setProjection(projection);
 
     if (projection == null) {
       criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
     }
 
     HibernateUtils.setOrderEntries(criteria, orderEntries);
 
     if (totalCount.intValue() < 1) {
       return new Page();
     }
 
     int start = (pageNo - 1) * pageSize;
     List result = criteria.setFirstResult(start).setMaxResults(pageSize).list();
 
     Page page = new Page(result, totalCount.intValue());
     page.setPageNo(pageNo);
     page.setPageSize(pageSize);
 
     return page;
   }
 
   @Transactional(readOnly=true)
   public <T> Page pagedQuery(Class<T> entityClass, int pageNo, int pageSize, Criterion[] criterions)
   {
     Criteria criteria = createCriteria(entityClass, criterions);
 
     return pagedQuery(criteria, pageNo, pageSize);
   }
 
   @Transactional(readOnly=true)
   public <T> Page pagedQuery(Class<T> entityClass, int pageNo, int pageSize, String orderBy, boolean isAsc, Criterion[] criterions)
   {
     Criteria criteria = createCriteria(entityClass, orderBy, isAsc, criterions);
 
     Page page = pagedQuery(criteria, pageNo, pageSize);
     page.setOrderBy(orderBy);
     page.setOrder(isAsc ? "ASC" : "DESC");
 
     return page;
   }
 
   @Transactional(readOnly=true)
   public <T> Page pagedQuery(Class<T> entityClass, Page page)
   {
     String orderBy = page.getOrderBy();
     String order = page.getOrder();
 
     Criteria criteria = null;
 
     if (page.isOrderEnabled())
       criteria = createCriteria(entityClass, orderBy, "ASC".equals(order), new Criterion[0]);
     else {
       criteria = createCriteria(entityClass, new Criterion[0]);
     }
 
     Page resultPage = pagedQuery(criteria, page.getPageNo(), page.getPageSize());
 
     resultPage.setOrderBy(orderBy);
     resultPage.setOrder(order);
 
     return resultPage;
   }
 
   @Transactional(readOnly=true)
   public <T> Page pagedQuery(Class<T> entityClass, Page page, Criterion[] criterions)
   {
     String orderBy = page.getOrderBy();
     String order = page.getOrder();
 
     Criteria criteria = null;
 
     if (page.isOrderEnabled()) {
       criteria = createCriteria(entityClass, orderBy, "ASC".equals(order), criterions);
     }
     else {
       criteria = createCriteria(entityClass, criterions);
     }
 
     Page resultPage = pagedQuery(criteria, page.getPageNo(), page.getPageSize());
 
     resultPage.setOrderBy(orderBy);
     resultPage.setOrder(order);
 
     return resultPage;
   }
 }