Hibernate分页查询小结
通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:
1、QBE(Qurey By Example)检索方式
QBE
是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后
返回匹配的对象。QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。
- /**
- * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的记录数
- * @param object
- * 将查询条件封装为Object
- * @return 将查询结果封装为Pager返回
- */
- public Pager findPageByExample(int pageNo, int pageSize, Object object)
- {
- Pager pager = null;
- try
- {
- Criteria criteria = this.getSession().createCriteria(
- Class.forName(this.getEntity()));
- if (object != null)
- {
- criteria.add(Example.create(object).enableLike());
- }
- // 获取根据条件分页查询的总行数
- int rowCount = (Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult();
- criteria.setProjection(null);
- ) * pageSize);
- criteria.setMaxResults(pageSize);
- List result = criteria.list();
- pager = new Pager(pageSize, pageNo, rowCount, result);
- } catch (RuntimeException re)
- {
- throw re;
- } finally
- {
- return pager;
- }
- }
- /**
- * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的记录数
- * @param object
- * 将查询条件封装为Object
- * @return 将查询结果封装为Pager返回
- */
- public Pager findPageByExample(int pageNo, int pageSize, Object object)
- {
- Pager pager = null;
- try
- {
- Criteria criteria = this.getSession().createCriteria(
- Class.forName(this.getEntity()));
- if (object != null)
- {
- criteria.add(Example.create(object).enableLike());
- }
- // 获取根据条件分页查询的总行数
- int rowCount = (Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult();
- criteria.setProjection(null);
- criteria.setFirstResult((pageNo - 1) * pageSize);
- criteria.setMaxResults(pageSize);
- List result = criteria.list();
- pager = new Pager(pageSize, pageNo, rowCount, result);
- } catch (RuntimeException re)
- {
- throw re;
- } finally
- {
- return pager;
- }
- }
注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。
在BO层将需要模糊查询的列用"%%"串起来,不然仍然和"="一样。
BO层代码:
- /**
- * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
- * @param pageNo
- * 当前的页码
- * @param pageSize
- * 每页显示的记录数
- * @param mendName
- * 抢修人员的名称
- * @param specialty
- * 抢修人员的工种
- * @param post
- * 抢修人员的职称
- * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
- */
- public Pager getInfoByQuery(int pageNo, int pageSize, String mendName,
- String specialty, String post)
- {
- EicMend eicMend = new EicMend();
- )
- {
- eicMend.setMendname("%" + mendName + "%");
- }
- )
- {
- eicMend.setSpecialty(specialty);
- }
- )
- {
- eicMend.setPost(post);
- }
- Pager pager = erpManagerDao
- .findPageByExample(pageNo, pageSize, eicMend);
- return pager;
- }
- /**
- * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
- * @param pageNo
- * 当前的页码
- * @param pageSize
- * 每页显示的记录数
- * @param mendName
- * 抢修人员的名称
- * @param specialty
- * 抢修人员的工种
- * @param post
- * 抢修人员的职称
- * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
- */
- public Pager getInfoByQuery(int pageNo, int pageSize, String mendName,
- String specialty, String post)
- {
- EicMend eicMend = new EicMend();
- if (mendName != null && mendName.length() > 0)
- {
- eicMend.setMendname("%" + mendName + "%");
- }
- if (specialty != null && specialty.length() > 0)
- {
- eicMend.setSpecialty(specialty);
- }
- if (post != null && post.length() > 0)
- {
- eicMend.setPost(post);
- }
- Pager pager = erpManagerDao
- .findPageByExample(pageNo, pageSize, eicMend);
- return pager;
- }
执行SQL语句如下:
- Hibernate: select count(*) as y0_ from YJZX.EIC_MEND this_ where
- (this_.MENDNAME like ? and this_.POST like ?)
- Hibernate: select * from ( select this_.MENDID as MENDID23_0_, ……
- this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where
- (this_.MENDNAME like ? and this_.POST like ?) ) where rownum <= ?
- Hibernate: select count(*) as y0_ from YJZX.EIC_MEND this_ where
- (this_.MENDNAME like ? and this_.POST like ?)
- Hibernate: select * from ( select this_.MENDID as MENDID23_0_, ……
- this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where
- (this_.MENDNAME like ? and this_.POST like ?) ) where rownum <= ?
所以只需将需模糊查询的列用“%%”链接即可。
2、QBC(Qurey By Criteria)检索方式
采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC
API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Restrictions接口组成,它支持在运行时动态生成
查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用Criterion…不定参数传参。
Map传参方式范例如下:
DAO层:
- /**
- * @function 分页显示符合所有的记录数,将查询结果封装为Pager
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的条数
- * @param map
- * 将查询条件封装为map
- * @return 查询结果Pager
- */
- public Pager findPageByCriteria(int pageNo, int pageSize, Map map)
- {
- Pager pager = null;
- try
- {
- Criteria criteria = this.getSession().createCriteria(
- Class.forName(this.getEntity()));
- if (map != null)
- {
- Set<String> keys = map.keySet();
- for (String key : keys)
- {
- criteria.add(Restrictions.like(key, map.get(key)));
- }
- }
- // 获取根据条件分页查询的总行数
- int rowCount = (Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult();
- criteria.setProjection(null);
- ) * pageSize);
- criteria.setMaxResults(pageSize);
- List result = criteria.list();
- pager = new Pager(pageSize, pageNo, rowCount, result);
- } catch (RuntimeException re)
- {
- throw re;
- } finally
- {
- return pager;
- }
- }
- /**
- * @function 分页显示符合所有的记录数,将查询结果封装为Pager
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的条数
- * @param map
- * 将查询条件封装为map
- * @return 查询结果Pager
- */
- public Pager findPageByCriteria(int pageNo, int pageSize, Map map)
- {
- Pager pager = null;
- try
- {
- Criteria criteria = this.getSession().createCriteria(
- Class.forName(this.getEntity()));
- if (map != null)
- {
- Set<String> keys = map.keySet();
- for (String key : keys)
- {
- criteria.add(Restrictions.like(key, map.get(key)));
- }
- }
- // 获取根据条件分页查询的总行数
- int rowCount = (Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult();
- criteria.setProjection(null);
- criteria.setFirstResult((pageNo - 1) * pageSize);
- criteria.setMaxResults(pageSize);
- List result = criteria.list();
- pager = new Pager(pageSize, pageNo, rowCount, result);
- } catch (RuntimeException re)
- {
- throw re;
- } finally
- {
- return pager;
- }
- }
Map传参方式对应BO层代码:
- /**
- * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
- * @param pageNo
- * 当前的页码
- * @param pageSize
- * 每页显示的记录数
- * @param mendName
- * 抢修人员的名称
- * @param specialty
- * 抢修人员的工种
- * @param post
- * 抢修人员的职称
- * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
- */
- public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,
- String specialty, String post)
- {
- Map map = new HashMap();
- )
- {
- map.put("mendname", "%" + mendName + "%");
- }
- )
- {
- map.put("specialty", specialty);
- }
- )
- {
- map.put("post", post);
- }
- Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map);
- return pager;
- }
- /**
- * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
- * @param pageNo
- * 当前的页码
- * @param pageSize
- * 每页显示的记录数
- * @param mendName
- * 抢修人员的名称
- * @param specialty
- * 抢修人员的工种
- * @param post
- * 抢修人员的职称
- * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
- */
- public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,
- String specialty, String post)
- {
- Map map = new HashMap();
- if (mendName != null && mendName.length() > 0)
- {
- map.put("mendname", "%" + mendName + "%");
- }
- if (specialty != null && specialty.length() > 0)
- {
- map.put("specialty", specialty);
- }
- if (post != null && post.length() > 0)
- {
- map.put("post", post);
- }
- Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map);
- return pager;
- }
第二种方式:Criterion…不定参数传参方式。其代码如下所示:
DAO层代码:
- /**
- * @function 分页显示符合所有的记录数,将查询结果封装为Pager
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的条数
- * @param criterions
- * 不定参数Criterion
- * @return 查询结果Pager
- */
- public Pager findPageByCriteria(int pageNo, int pageSize,
- Criterion... criterions)
- {
- Pager pager = null;
- try
- {
- Criteria criteria = this.getSession().createCriteria(
- Class.forName(this.getEntity()));
- if (criterions != null)
- {
- for (Criterion criterion : criterions)
- {
- if (criterion != null)
- {
- criteria.add(criterion);
- }
- }
- }
- // 获取根据条件分页查询的总行数
- int rowCount = (Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult();
- criteria.setProjection(null);
- ) * pageSize);
- criteria.setMaxResults(pageSize);
- List result = criteria.list();
- pager = new Pager(pageSize, pageNo, rowCount, result);
- } catch (RuntimeException re)
- {
- throw re;
- } finally
- {
- return pager;
- }
- }
- /**
- * @function 分页显示符合所有的记录数,将查询结果封装为Pager
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的条数
- * @param criterions
- * 不定参数Criterion
- * @return 查询结果Pager
- */
- public Pager findPageByCriteria(int pageNo, int pageSize,
- Criterion... criterions)
- {
- Pager pager = null;
- try
- {
- Criteria criteria = this.getSession().createCriteria(
- Class.forName(this.getEntity()));
- if (criterions != null)
- {
- for (Criterion criterion : criterions)
- {
- if (criterion != null)
- {
- criteria.add(criterion);
- }
- }
- }
- // 获取根据条件分页查询的总行数
- int rowCount = (Integer) criteria.setProjection(
- Projections.rowCount()).uniqueResult();
- criteria.setProjection(null);
- criteria.setFirstResult((pageNo - 1) * pageSize);
- criteria.setMaxResults(pageSize);
- List result = criteria.list();
- pager = new Pager(pageSize, pageNo, rowCount, result);
- } catch (RuntimeException re)
- {
- throw re;
- } finally
- {
- return pager;
- }
- }
Criterion…不定参数传参方式对应BO层代码:
- /**
- * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
- * @param pageNo
- * 当前的页码
- * @param pageSize
- * 每页显示的记录数
- * @param mendName
- * 抢修人员的名称
- * @param specialty
- * 抢修人员的工种
- * @param post
- * 抢修人员的职称
- * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
- */
- public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName,
- String specialty, String post)
- {
- Criterion criterion1 = null, criterion2 = null, criterion3 = null;
- )
- {
- criterion1 = Restrictions.ilike("mendname", mendName,
- MatchMode.ANYWHERE);
- }
- )
- {
- criterion2 = Restrictions.ilike("specialty", specialty,
- MatchMode.EXACT);
- }
- )
- {
- criterion3 = Restrictions.ilike("post", post, MatchMode.EXACT);
- }
- Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize,
- criterion1, criterion2, criterion3);
- return pager;
- }
- /**
- * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
- * @param pageNo
- * 当前的页码
- * @param pageSize
- * 每页显示的记录数
- * @param mendName
- * 抢修人员的名称
- * @param specialty
- * 抢修人员的工种
- * @param post
- * 抢修人员的职称
- * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
- */
- public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName,
- String specialty, String post)
- {
- Criterion criterion1 = null, criterion2 = null, criterion3 = null;
- if (mendName != null && mendName.length() > 0)
- {
- criterion1 = Restrictions.ilike("mendname", mendName,
- MatchMode.ANYWHERE);
- }
- if (specialty != null && specialty.length() > 0)
- {
- criterion2 = Restrictions.ilike("specialty", specialty,
- MatchMode.EXACT);
- }
- if (post != null && post.length() > 0)
- {
- criterion3 = Restrictions.ilike("post", post, MatchMode.EXACT);
- }
- Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize,
- criterion1, criterion2, criterion3);
- return pager;
- }
3、HQL检索方式
HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。
使用Query接口分页查询DAO代码:
- /**
- * @function 分页显示符合所有的记录数,将查询结果封装为Pager
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的条数
- * @param instance
- * 将查询条件封装为专家Bean
- * @return 查询结果Pager
- */
- public List<Object> findPageByQuery(int pageNo, int pageSize, String hql,
- Map map)
- {
- List<Object> result = null;
- try
- {
- Query query = this.getSession().createQuery(hql);
- Iterator it = map.keySet().iterator();
- while (it.hasNext())
- {
- Object key = it.next();
- query.setParameter(key.toString(), map.get(key));
- }
- ) * pageSize);
- query.setMaxResults(pageSize);
- result = query.list();
- } catch (RuntimeException re)
- {
- throw re;
- }
- return result;
- }
- /**
- * @function 分页显示符合所有的记录数,将查询结果封装为Pager
- * @param pageNo
- * 当前页数
- * @param pageSize
- * 每页显示的条数
- * @param instance
- * 将查询条件封装为专家Bean
- * @return 查询结果Pager
- */
- public List<Object> findPageByQuery(int pageNo, int pageSize, String hql,
- Map map)
- {
- List<Object> result = null;
- try
- {
- Query query = this.getSession().createQuery(hql);
- Iterator it = map.keySet().iterator();
- while (it.hasNext())
- {
- Object key = it.next();
- query.setParameter(key.toString(), map.get(key));
- }
- query.setFirstResult((pageNo - 1) * pageSize);
- query.setMaxResults(pageSize);
- result = query.list();
- } catch (RuntimeException re)
- {
- throw re;
- }
- return result;
- }
查询所有记录数的DAO代码:
- /**
- * @function 根据查询条件查询记录数的个数
- * @param hql
- * hql查询语句
- * @param map
- * 用map封装查询条件
- * @return 数据库中满足查询条件的数据的条数
- */
- public int getTotalCount(String hql, Map map)
- {
- try
- {
- Query query = this.getSession().createQuery(hql);
- Iterator it = map.keySet().iterator();
- while (it.hasNext())
- {
- Object key = it.next();
- query.setParameter(key.toString(), map.get(key));
- }
- );
- return i;
- } catch (RuntimeException re)
- {
- throw re;
- }
- }
- /**
- * @function 根据查询条件查询记录数的个数
- * @param hql
- * hql查询语句
- * @param map
- * 用map封装查询条件
- * @return 数据库中满足查询条件的数据的条数
- */
- public int getTotalCount(String hql, Map map)
- {
- try
- {
- Query query = this.getSession().createQuery(hql);
- Iterator it = map.keySet().iterator();
- while (it.hasNext())
- {
- Object key = it.next();
- query.setParameter(key.toString(), map.get(key));
- }
- Integer i = (Integer) query.list().get(0);
- return i;
- } catch (RuntimeException re)
- {
- throw re;
- }
- }
BO层代码:
- /**
- * @function 将传递过来的参数封装成专家Bean,分页查询符合条件的记录
- * @param pageNo
- * 当前的页码
- * @param pageSize
- * 每页显示的记录数
- * @param expertName
- * 专家的名称
- * @param expertSpecialty
- * 专家的专业类别
- * @param post
- * 专家的行政职位
- * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
- */
- public Pager getInfoByQuery(int pageNo, int pageSize, String expertName,
- String expertSpecialty, String post)
- {
- StringBuffer hql = new StringBuffer();
- hql.append("select count(expertid) from EicExpert where 1=1 ");
- Map map = new HashMap();
- )
- {
- map.put("expertname", "%" + expertName + "%");
- hql.append("and expertname like :expertname ");
- }
- )
- {
- map.put("expertspecialty", expertSpecialty);
- hql.append("and expertspecialty like :expertspecialty ");
- }
- )
- {
- map.put("post", post);
- hql.append("and post like :post ");
- }
- );
- List result = erpManagerDao.findPageByQuery(pageNo, pageSize,
- queryHql, map);
- int rowCount = erpManagerDao.getTotalCount(hql.toString(), map);
- Pager pager = new Pager(pageSize, pageNo, rowCount, result);
- return pager;
- }
Hibernate分页查询小结的更多相关文章
- Hibernate 分页 查询
昨天的作业 分页: 主要的代码块:(明天实现分页的封装) package com.cy.beans; import java.util.List; /** * 定义一个分页对象 * @author ...
- Hibernate分页查询的两个方法
Hibernate中HQL查询语句有一个分页查询, session.setMaxResult(参数)和session.setFirstResult(参数) 如果只设置session.setMaxRes ...
- hibernate分页查询的各种方法
统计总数: public Integer countAll1() { String hql = "select count(*) from News as news"; List ...
- hibernate分页查询的实现
在mysql中新建数据好USER表,字段有3个,分别是id.username.password,贴上脚本仅供参考 create table `ding`.`user`( `id ...
- [Hibernate] 分页查询
@Test public void test9(){ //根据部门编号进行分组,再根据每个部门总工资>5000 Session ss=HibernateUtil.getSession(); St ...
- Hibernate分页查询报错
不知道什么原因,就是这里报错的
- Hibernate的查询,二级缓存,连接池
Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...
- Hibernate分页功能数据重复问题
今天遇到一个很憋屈的问题那就是hibernate分页查询中出现重复数据,本来一直没有在意,以为是数据问题,但是一查程序和数据都没有问题,继续深入查看,找到问题了就是order By 时出的问题,唉.. ...
- 用Hibernate和Struts2+jsp实现分页查询、修改删除
1.首先用get的方法传递一个页数过去 2.通过Struts2跳转到Action 3.通过request接受主页面index传过的页数,此时页数是1, 然后调用service层的方法获取DAO层分页查 ...
随机推荐
- C++ 隐式类类型转换和转换操作符
隐式类类型转换 C++语言定义了内置类型之间的几个自动转换.也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型.为了定义到类类型的隐式转换,需要定义合适的构 ...
- 在Dll中创建对话框并调用
1.第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”. 2.添加一对话框资源到工程中,从 ...
- PHP 5 数据类型
本页内容来自http://www.runoob.com/php/php-datatypes.html String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型 ...
- 1. 用自己的算法实现startsWith和endsWith功能。
package com.xinjian; public class Chazifu { public static void main(String[] args) { String a=" ...
- 中国内地、台湾、香港、澳门和国外DNS服务器地址列表
中国内地.台湾.香港.澳门和国外DNS服务器地址列表 详细内容 作者:网路岗 来源:局域网监控软件 DNS(Domain Name System)是域名解析服务器的意思,它在互联网的作用是把域名转换成 ...
- 19个心得 明明白白说Linux下的负载均衡
[51CTO.com独家特稿]前言:作为一名Linux/unix系统工程师,这几年一直在涉及到对外项目,经手过许多小中型网站的架构,F5.LVS及Nginx接触的都比较多,我想一种比较通俗易懂的语气跟 ...
- LinuxIP地址、网卡相关、克隆、VM
改IP地址(#setup) 1.输入vi /etc/sysconfig/network-scripts/ifcfg-eth0 2.里面的内容修改为 DEVICE=eth0HWADDR=FC:4D:D4 ...
- “Installation error: INSTALL_PARSE_FAILED_MANIFEST_MALFORMED”
1. 有可能你的客户端已经安装过了,需要移调才能安装2. 你的清单文件AndroidManifest.xml写的有问题,检查一下
- Inno Setup入门(十)——操作注册表
有些程序需要随系统启动,或者需要建立某些文件关联等问题,这些都是通过在安装程序中对注册表进行操作的结果.Inno Setup中通过[registry]段实现对注册表的操作. 本段说明: 参数列表: 参 ...
- linux配置使用外部smtp发送邮件
mail命令需要设定mail.rc(或nail.rc)文件, set from=user@domain.comset smtp=smtp.domain.comset smtp-auth-user=us ...