`
jayyanzhang2010
  • 浏览: 377910 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

利用hibernate的DetachedCriteria进行分页

阅读更多
Hibernate3提供了DetachedCriteria,使得我们可以在Web层构造detachedCriteria,然后调用业务层Bean,进行动态条件查询,根据这一功能,我设计了通用的抽象Bean基类和分页类支持,代码来自于Quake Wang的javaeye-core包的相应类,然后又做了很多修改。
  分页支持类:
  

package com.iteye.common.util; 
 
import java.util.List; 
 
public class PaginationSupport { 
 
    public final static int PAGESIZE = 30;  //定义一页显示多少行记录
 
    private int pageSize = PAGESIZE; 
 
    private List items;                              //查询的结果集
 
    private int totalCount;                       //一共有多少条适合的记录
 
    private int[] indexes = new int[0];     //查出总记录数后,记录每一页开始的记录号
 
    private int startIndex = 0;                 //当前为第几页
  /*------------------------------三个构造函数*/
    public PaginationSupport(List items, int totalCount) { 
        setPageSize(PAGESIZE); 
        setTotalCount(totalCount); 
        setItems(items);         
        setStartIndex(0); 
    } 
 
    public PaginationSupport(List items, int totalCount, int startIndex) { 
        setPageSize(PAGESIZE); 
        setTotalCount(totalCount); 
        setItems(items);         
        setStartIndex(startIndex); 
    } 
 
    public PaginationSupport(List items, int totalCount, int pageSize, int startIndex) { 
        setPageSize(pageSize); 
        setTotalCount(totalCount); 
        setItems(items); 
        setStartIndex(startIndex); 
    } 
 
    public List getItems() { 
        return items; 
    } 
 
    public void setItems(List items) { 
        this.items = items; 
    } 
 
    public int getPageSize() { 
        return pageSize; 
    } 
 
    public void setPageSize(int pageSize) { 
        this.pageSize = pageSize; 
    } 
 
    public int getTotalCount() { 
        return totalCount; 
    } 
  //设置总的记录数,总页数(count)  ,每一页的开始记录号
    public void setTotalCount(int totalCount) { 
        if (totalCount > 0) { 
            this.totalCount = totalCount; 
            int count = totalCount / pageSize; 
            if (totalCount % pageSize > 0) 
                count++; 
            indexes = new int[count]; 
            for (int i = 0; i < count; i++) { 
                indexes[i] = pageSize * i; 
            } 
        } else { 
            this.totalCount = 0; 
        } 
    } 
 
    public int[] getIndexes() { 
        return indexes; 
    } 
 
    public void setIndexes(int[] indexes) { 
        this.indexes = indexes; 
    } 
 
    public int getStartIndex() { 
        return startIndex; 
    } 
  //设置起始页的位置
    public void setStartIndex(int startIndex) { 
        if (totalCount <= 0) 
            this.startIndex = 0; 
        else if (startIndex >= totalCount) 
            this.startIndex = indexes[indexes.length - 1]; 
        else if (startIndex < 0) 
            this.startIndex = 0; 
        else { 
            this.startIndex = indexes[startIndex / pageSize]; 
        } 
    } 
  //下一页
    public int getNextIndex() { 
        int nextIndex = getStartIndex() + pageSize; 
        if (nextIndex >= totalCount) 
            return getStartIndex(); 
        else 
            return nextIndex; 
    } 
  //上一页
    public int getPreviousIndex() { 
        int previousIndex = getStartIndex() - pageSize; 
        if (previousIndex < 0) 
            return 0; 
        else 
            return previousIndex; 
    } 
 


抽象业务类(我们的类要继承这个抽象类, 以便使用里面的类进行分类)

package com.iteye.common.business; 
 
import java.io.Serializable; 
import java.util.List; 
 
import org.hibernate.Criteria; 
import org.hibernate.HibernateException; 
import org.hibernate.Session; 
import org.hibernate.criterion.DetachedCriteria; 
import org.hibernate.criterion.Projections; 
import org.springframework.orm.hibernate3.HibernateCallback; 
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 
 
import com.iteye.common.util.PaginationSupport; 
 
public abstract class AbstractManager extends HibernateDaoSupport { 
 
    private boolean cacheQueries = false; 
 
    private String queryCacheRegion; 
 
    public void setCacheQueries(boolean cacheQueries) { 
        this.cacheQueries = cacheQueries; 
    } 
 
    public void setQueryCacheRegion(String queryCacheRegion) { 
        this.queryCacheRegion = queryCacheRegion; 
    } 
   //保存
    public void save(final Object entity) { 
        getHibernateTemplate().save(entity); 
    } 
 
    public void persist(final Object entity) { 
        getHibernateTemplate().save(entity); 
    } 
  //更新
    public void update(final Object entity) { 
        getHibernateTemplate().update(entity); 
    } 
  //删除
    public void delete(final Object entity) { 
        getHibernateTemplate().delete(entity); 
    } 
   //加载
    public Object load(final Class entity, final Serializable id) { 
        return getHibernateTemplate().load(entity, id); 
    } 
 
    public Object get(final Class entity, final Serializable id) { 
        return getHibernateTemplate().get(entity, id); 
    } 
   //查询全部
    public List findAll(final Class entity) { 
        return getHibernateTemplate().find("from " + entity.getName()); 
    } 
   //通过名字查询
    public List findByNamedQuery(final String namedQuery) { 
        return getHibernateTemplate().findByNamedQuery(namedQuery); 
    } 
  //通过参数动态查询
    public List findByNamedQuery(final String query, final Object parameter) { 
        return getHibernateTemplate().findByNamedQuery(query, parameter); 
    } 
 
    public List findByNamedQuery(final String query, final Object[] parameters) { 
        return getHibernateTemplate().findByNamedQuery(query, parameters); 
    } 
   
    public List find(final String query) { 
        return getHibernateTemplate().find(query); 
    } 
 
    public List find(final String query, final Object parameter) { 
        return getHibernateTemplate().find(query, parameter); 
    } 
  //以下是分页查询
    public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria) { 
             //通过detachedCriteri,一页显示记录数,   当前是第几页查询(0)
        return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, 0); 
    } 
 
    public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int startIndex) { 
           //用户指定当前为第几页
           return findPageByCriteria(detachedCriteria, PaginationSupport.PAGESIZE, startIndex); 
    } 
 
    public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int pageSize, 
            final int startIndex) { 
           //用户同时指定  每页显示的记录数,和  当前页为第几页
        return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() { 
            public Object doInHibernate(Session session) throws HibernateException { 
                Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
                int totalCount = ((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue(); 
                criteria.setProjection(null); 
                List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list(); 
                PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize, startIndex); 
                return ps; 
            } 
        }, true); 
    } 
 
    public List findAllByCriteria(final DetachedCriteria detachedCriteria) { 
        return (List) getHibernateTemplate().execute(new HibernateCallback() { 
            public Object doInHibernate(Session session) throws HibernateException { 
                Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
                return criteria.list(); 
            } 
        }, true); 
    } 
 
    public int getCountByCriteria(final DetachedCriteria detachedCriteria) { 
        Integer count = (Integer) getHibernateTemplate().execute(new HibernateCallback() { 
            public Object doInHibernate(Session session) throws HibernateException { 
                Criteria criteria = detachedCriteria.getExecutableCriteria(session); 
                return criteria.setProjection(Projections.rowCount()).uniqueResult(); 
            } 
        }, true); 
        return count.intValue(); 
    } 

用户在web层构造查询条件detachedCriteria,和可选的startIndex,调用业务bean的相应findByCriteria方法,返回一个PaginationSupport的实例ps。

ps.getItems()得到已分页好的结果集
ps.getIndexes()得到分页索引的数组
ps.getTotalCount()得到总结果数
ps.getStartIndex()当前分页索引
ps.getNextIndex()下一页索引
ps.getPreviousIndex()上一页索引
分享到:
评论

相关推荐

    Hibernate 使用DetachedCriteria操作

    - 在服务层进行分页查询时,可以先创建DetachedCriteria,然后在视图层根据请求参数调整限制条件,避免重复计算。 **4. DetachedCriteria 的基本用法** 创建DetachedCriteria通常从`DetachedCriteria.forClass()`...

    Hibernate+sqlserver2000分页

    本篇文章将深入探讨使用Hibernate ORM框架与SQL Server 2000数据库进行分页查询的方法。 首先,Hibernate是Java领域中最流行的ORM(对象关系映射)框架之一,它允许开发者使用面向对象的方式操作数据库,减少了直接...

    springMVC+hibernate的条件查询加分页的demo

    总的来说,"springMVC+hibernate的条件查询加分页的demo"涵盖了Web应用中常见的查询和分页需求,通过SpringMVC接收和处理用户请求,利用Hibernate的Criteria查询动态构造SQL,并通过设置分页参数实现数据的分批次...

    struts2+spring+hibernate分页查询

    在Struts2、Spring和Hibernate的整合项目中,通常在Service层调用DAO层的方法进行数据库查询,DAO层可以利用Hibernate的Criteria或HQL进行分页操作。Service层处理完分页后,将结果封装成包含数据和分页信息的对象,...

    sh分页,增删改查

    Criteria查询提供了动态构建查询的方式,可以通过DetachedCriteria实现分页;HQL是面向对象的查询语言,可以方便地进行分页;对于更复杂的SQL操作,可以直接使用SQL查询,并配合 ScrollableResults 接口实现分页。在...

    Hibernate 在查询操作中要使用分页+命名参数+排序技术

    本文将深入探讨如何在使用Hibernate框架时,有效地结合这些技术进行数据操作。 首先,我们来了解**分页查询**。在处理大数据量时,一次性加载所有数据不仅会消耗大量内存,还可能导致用户界面响应缓慢。为解决这个...

    Hibernate 查询经典练习题

    Criteria API先进行排序,然后使用`setFirstResult`和`setMaxResults`进行分页。 通过上述例子,我们可以看到HQL更接近SQL语法,而Criteria API提供了一个更面向对象的API,两者在处理不同查询场景时各有优势。在...

    hibernate in action 中文版书籍

    5. ** Criteria和DetachedCriteria**:详细阐述Criteria查询的使用,包括条件查询、排序、分页,以及DetachedCriteria的概念,用于创建可复用的查询模板。 6. **事务和缓存**:讨论Hibernate的事务管理,包括编程式...

    孙卫琴精通hibernate part2

    - 学习如何使用Criteria API创建查询,包括添加限制条件、排序、分页等,以及如何使用DetachedCriteria进行延迟加载。 3. **Chapter 10:一对多与多对一关系映射** - Hibernate支持多种关系映射,本章将深入讲解...

    传智播客_hibernate

    1. **对象关系映射(ORM)**: Hibernate是ORM的一种实现,它将Java对象与数据库表进行映射,使开发者可以用面向对象的方式来操作数据库。 2. **Configuration**: Hibernate配置文件(hibernate.cfg.xml)用于设置...

    Hibernate3中文文档

    8. ** Criteria API的DetachedCriteria**:DetachedCriteria允许在不打开Session的情况下构建查询,之后在需要时再与Session结合执行,适合于分页查询和延迟加载。 9. **缓存机制**:Hibernate提供了第一级缓存...

    韩顺平2011hibernate3.3视频教程ppt、笔记

    6. Criteria构建复杂查询:学习如何使用DetachedCriteria进行分页、排序等复杂查询。 7.实体关系映射(E-R Mapping):理解一对一、一对多、多对一、多对多等关系的映射配置。 8.懒加载与立即加载:学习何时使用懒...

    Hibernate实体层设计

    本资料主要探讨了如何利用Hibernate进行高效的实体层设计,帮助开发者更好地理解和运用Hibernate。 一、Hibernate简介 Hibernate是一个开源的ORM框架,它将Java对象与数据库表进行映射,实现了对象与SQL的解耦,...

    Hibernate的MySql查询.rar

    另外,Hibernate的 Criteria API 还可以配合DetachedCriteria使用,实现延迟加载(Lazy Loading),这对于处理大数据量时的性能优化至关重要。延迟加载允许我们在需要时才加载关联的对象,避免一次性加载大量数据...

    hibernate 3.2.2

    2. 分页查询:使用`setFirstResult()`和`setMaxResults()`进行分页,避免一次性加载大量数据。 3. 避免N+1查询问题:通过预加载关联数据或使用`JOIN`查询减少额外的数据库调用。 九、高级特性 1. 异步操作:通过...

    Hibernate-基础联表模板

    通过DetachedCriteria、Criteria、Projection等接口,可以方便地实现联表查询,同时支持各种查询条件、排序和分页。 6. **多对一(One-to-Many)和一对多(Many-to-One)关联** 这是两种常见的关联关系。在...

    hibernate-release-5.2.3.Final

    Criteria API提供了一种更灵活的查询方式,通过DetachedCriteria实现离线查询,通过Criteria构建动态查询,结合Projection和Criterion进行结果集处理和条件限制。 8. Hibernate缓存: Hibernate支持二级缓存,...

    hibernate-distribution-3.5.0-Final-dist文档

    **hibernate-distribution-3.5.0-Final-dist文档概述** ...通过深入理解和熟练应用这些知识,开发者可以有效地利用Hibernate 3.5.0-Final来简化Java应用程序的数据库操作,提高开发效率和代码质量。

    Hibernate

    12. ** Hibenate与Spring的整合**:介绍如何在Spring框架中集成Hibernate,利用Spring的事务管理,实现DAO和Service层的解耦。 13. **案例分析**:通过实际例子演示如何在项目中应用Hibernate,解决具体问题。 每...

    Hibernate3.2中文手册

    **Hibernate 3.2 中文手册** Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者在Java应用程序中...通过深入学习并实践手册中的内容,开发者可以更好地利用Hibernate来简化数据库操作,提高开发效率。

Global site tag (gtag.js) - Google Analytics