应用Hibernate3的DetachedCriteria实现分页查询

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

分页支持类:

java代码: 



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;
        }

        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;
        }

}

<o:p> </o:p>



抽象业务类

java代码: 



/**
* Created on <st1:chsdate year="2005" month="7" day="12" islunardate="False" isrocdate="False" w:st="on">2005-7-12</st1:chsdate>
*/
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) {
                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();
        }
}

<o:p> </o:p>




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

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

 来源:http://forum.iteye.com/viewtopic.php?t=14657

Hibernate 多表连接分页查询示范项目 Hibernate 多表连接分页查询示范项目 Hibernate Criteria 多表连接 分页 立即下载

相关推荐

基于STM32与毫米波雷达的非接触式睡眠监测系统

物联网和嵌入式系统技术正在推动医疗健康设备的智能化发展。通过传感器网络采集生理信号,结合信号处理算法实现健康监测已成为主流技术方案。毫米波雷达凭借其非接触检测特性,在呼吸、心率等生命体征监测中展现出独特优势。STM32系列MCU凭借丰富外设和低功耗特性,成为医疗级嵌入式设备的首选平台。本系统整合60GHz毫米波雷达、红外测温与无线传输模块,构建了完整的睡眠质量评估解决方案,其硬件架构设计、信号处理算法和低功耗优化策略对可穿戴医疗设备开发具有参考价值。

weixin_36369848的博客 612

利用hibernate的DetachedCriteria进行分页

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

xrt95050的专栏 2210

逆向工程实战:如何一步步破解京东APP的sign签名算法(附Frida脚本)

本文详细解析了京东APP的sign签名算法逆向工程实战,通过Frida脚本动态分析Java层和Native层的多层签名机制,揭示商业应用的加密协议设计。文章提供了完整的逆向工程方法论与工具链,帮助开发者深入理解移动应用安全防护体系,提升安全防御能力。

weixin_28622215的博客 918

JPA通过DetachedCriteria实现分页

 **  * 获取Session对象  */public Session getSession(){    EntityManager em=this.getJpaTemplate().getEntityManagerFactory().createEntityManager();    return (Session) em.getDelegate();}  

dream8062的专栏 3812

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

scRNA-seq | 吐血整理的单细胞入门教程(从原理到代码实操)(二)

m0_72224305的博客 4306

Basilisk库教程

要在仿真中执行模块,其调度由Basilisk的[Process]和[Task]容器控制。BSK[Task]包含一系列模块,这些模块都以相同的更新频率执行。一个[Process]本质上是一个任务组,可以包含多个相关的任务。例如,在多星仿真中,你可以为每颗卫星创建一个[Process],以便将相关任务和嵌入式模块有序地组织起来。下图展示了一个示例布局,其中bskSat卫星的动力学被添加到与飞行软件(FSW)算法分开的进程中,这些算法在该卫星上执行。在每个进程中,设置了若干任务,这些任务以指定的频率进行评估。

weixin_57997461的博客 1137

91---Criteria的内链接,分页,查询唯一对象,条件查询,分组统计,投影查询,DetachedCriteria

Restrictions.like(属性名, 查询条件的值, 匹配方式): Restrictions.in(属性名, 查询条件的值, 匹配方式): Restrictions.eq(属性名, 查询条件的值, 匹配方式):   Criteria Query常用的查询限制方法 Restrictions.eq() equal,= Restrictions.allEq()

lixiao1048的博客 4713

如何通过 GitHub Actions 使用 SSH 自动化部署到阿里云 ECS 实例

通过 GitHub Actions 和 SSH 自动化部署,可以显著提高你的开发效率和部署的可靠性。本文介绍了如何生成 SSH 密钥、将公钥添加到阿里云 ECS 实例、将私钥添加到 GitHub Secrets,以及编写 GitHub Actions 工作流来实现自动化部署。希望这篇文章对你有所帮助!

吃面不喝汤的博客 1511

Hibernate里面如何使用DetachedCriteriaCriteria 实现多条件分页查询

WEB层: // 获取分页的请求参数 String start = request.getParameter(“start”); String page = request.getParameter(“page”); String limit = request.getParameter(“limit”); //获取请求表单的值,然后根据值是否为空,构件离线查询条件。 String tb_zzid...

Troub_cy的博客 395

云原生之容器编排实践-在K8S集群中使用Registry2搭建私有镜像仓库

基于前面搭建的3节点 Kubernetes 集群,今天我们使用 Registry2 搭建私有镜像仓库,这在镜像安全性以及离线环境下运维等方面具有重要意义。作为测试环境,本次使用 Registry2 搭建了私有镜像仓库,实际生产环境建议使用 Harbor;创建了一个 local-storage 的 StorageClass ,并使用本地磁盘的方式创建使用 PV ,实际建议使用 NFS 。

Heartsuit的博客 2461

MicroCap声学仿真介绍(五)-倒相管扬声器系统仿真

实际倒相管的扬声器单体选择、后腔容积、倒相管的直径和长度都是需要精心挑选的,为了便于演示,随意指定了倒相管的长度和直径,现实中还是不能这么随便的。之前介绍了封闭式扬声器的仿真,今天在封闭式扬声器的基础上,再介绍一下倒相管扬声器系统的仿真。

山无忧的博客 1718

DetachedCriteria查询、分页类和分页按钮

花了两天时间才整理好的分页类,共享一下。说明:该方法是参考了一下网上广为流传的DetachedCriteria查询方法后改进而来的。按照自己觉得满意呈现和重用方式。按钮的效果可以简单的做到附件图片上的效果虽然不敢说完美的分页按钮,但是很多大型网站都是用这样的吧。------------------------------------分页Bean类:import java.util.List;

晓郎编程 6383

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

上一篇: 通过XDoclet(ant)生成Hibernate映射文件
下一篇: Hibernate分页
lhycarter
博客等级 码龄14年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值