Hibernate 分页 查询

 昨天的作业  分页:

主要的代码块:(明天实现分页的封装)

 1 package com.cy.beans;
 2
 3 import java.util.List;
 4
 5 /**
 6  * 定义一个分页对象
 7  * @author acer
 8  *
 9  */
10 public class Pager {
11
12     private int page;//当前页码
13     private int pageTotal;//总页码
14     private int rowsTotal;//总条数
15     private int rows;//每页显示条数
16         private String hql;//分页语句
17     private List<?> list;//返回的数据集合
18
19
20     public Pager() {
21         super();
22     }
23
24     public String getHql() {
25         return hql;
26     }
27
28
29
30     public void setHql(String hql) {
31         this.hql = hql;
32     }
33
34
35
36     public int getPage() {
37         return page;
38     }
39     public void setPage(int page) {
40         this.page = page;
41     }
42     public int getPageTotal() {
43         return pageTotal;
44     }
45     public void setPageTotal(int pageTotal) {
46         this.pageTotal = pageTotal;
47     }
48     public int getRowsTotal() {
49         return rowsTotal;
50     }
51     public void setRowsTotal(int rowsTotal) {
52         this.rowsTotal = rowsTotal;
53         pageTotal = rowsTotal%rows==0 ? rowsTotal/rows : rowsTotal/rows+1;
54     }
55     public int getRows() {
56         return rows;
57     }
58     public void setRows(int rows) {
59         this.rows = rows;
60     }
61     public List<?> getList() {
62         return list;
63     }
64     public void setList(List<?> list) {
65         this.list = list;
66     }
67
68
69     @Override
70     public String toString() {
71         return "Pager [list=" + list + ", page=" + page + ", pageTotal="
72                 + pageTotal + ", rows=" + rows + ", rowsTotal=" + rowsTotal
73                 + "]";
74     }
75
76
77 }

 UserDaoImpl.java中的分页方法代码:

 1 public Pager pagerff(Pager p, Map<String, Object> pram) {
 2         Session session = null;
 3         Transaction tx = null;
 4         try {
 5             session=HibernateUtils.getSessionFactory().openSession();
 6             tx=session.beginTransaction();
 7             String hql=p.getHql();//获取查询语句
 8             Query query= session.createQuery(hql).setCacheable(true);
 9             //设置参数
10             query.setProperties(pram);
11             //查询具体数据
12             int count=query.list().size();
13             p.setRowsTotal(count);
14             int nowPage=1;
15             if(p.getPage()>0){
16                 nowPage=p.getPage();
17             }
18             //指定从那个对象开始查询,参数的索引位置是从0开始的,
19             query.setFirstResult((p.getPage()-1)*p.getRows());
20             //分页时,一次最多产寻的对象数
21             query.setMaxResults(p.getRows());
22             List<?> list1=query.list();
23             p.setList(list1);
24             tx.commit();
25
26         } catch (Exception e) {
27             e.printStackTrace();
28             tx.rollback();
29         }finally{
30             session.close();
31         }
32         return  p;
33     }

 

这个分页里主要使用了两个方法。

setFirstResult():设置从哪条数据开始查询的(分页的索引是从0开始的);
setProperties():设置每页显示的条数。

hibernate查询实现

 hibernate中查询对象的方式有:OID查询,HQL查询,标准对象(条件)查询,本地sql查询。

使用例子UserBean.java

 1 package com.cy.beans;
 2
 3 import java.io.Serializable;
 4
 5 public class UserBean implements Serializable  {
 6
 7     private static final long serialVersionUID = 1L;
 8
 9     private Integer id;
10     private String userName;
11     private String password;
12     public UserBean() {
13         super();
14     }
15
16     public Integer getId() {
17         return id;
18     }
19
20     public void setId(Integer id) {
21         this.id = id;
22     }
23
24     public String getUserName() {
25         return userName;
26     }
27     public void setUserName(String userName) {
28         this.userName = userName;
29     }
30     public String getPassword() {
31         return password;
32     }
33     public void setPassword(String password) {
34         this.password = password;
35     }
36     @Override
37     public String toString() {
38         return "UserBean [id=" + id + ", userName=" + userName + ", password="
39                 + password + "]";
40     }
41
42
43 }

 

先要定义IUserDao.java的接口。

一:OID查询:就是根据对象的id来查询(主要看看UserDaoImpl.java中实现的方法)

 1 public UserBean getUser(Class<?> cls, Serializable pk) {
 2         // Class<?> cls   泛型,表示某一类的Object。
 3         Session session = null;//获得session
 4         Transaction tx = null;//事务
 5         UserBean user=null;    //对象
 6         try {
 7             session=HibernateUtils.getSessionFactory().openSession();
 8             tx=session.beginTransaction();//开启事务
 9             user=(UserBean)session.get(cls, pk);//查询   这里的pk指的就是id
10             tx.commit();//提交事务
11         } catch (Exception e) {
12             e.printStackTrace();
13             tx.rollback();//回滚事务
14         }finally{
15             session.close();//关闭session
16         }
17         return user;
18     }

 

二:HQL查询:

hql(Hibernate Query Language)是一种面向对象的查询语言。也是在Hibernate应用最广的一种查询方式。

完整的HQL语法:

 

Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc

 

示例1:

UserDaoImpl.java

 1 public List<?> findUser(String sql, Map<String, Object> pram) {
 2         Session session = null;
 3         Transaction tx = null;
 4         List<?> list=null;
 5         try {
 6             session=HibernateUtils.getSessionFactory().openSession();
 7             tx=session.beginTransaction();
 8             Query query= session.createQuery(sql).setCacheable(true);
 9         String userName=pram.get("userName").toString();
10         String password=pram.get("password").toString();
11         query.setString("userName", '%'+userName+'%');
12         query.setString("password",password);
13         list=query.list();
14         tx.commit();
15
16         } catch (Exception e) {
17             e.printStackTrace();
18             tx.rollback();
19         }finally{
20             session.close();
21         }
22         return list;
23     }

 

UserServerImpl.java

1 @Override
2     public List<?> findUser(Map<String,Object>pram) {
3         //模糊查询
4         String hql="from UserBean where 1=1 and userName like :userName and password =:password";
5         return iusUserDao.findUser(hql, pram);
6     }

 

示例2:(这个就直接写了)

String hql="from UserBean as user where user.userName='kitty2'";

Query query=session.createQuery(hql);

List userList=query.list();

通过上面的例子可以看出HQL查询的基本操作步骤为:

1 创建Query对象: Query query= session.createQuery(sql)

2  动态绑定参数

3 通过调用Query对象的list()方法执行查询数据

注意:HQL语句本身大小写无关,但是其中出现的类名和属性名必须注意大小写区分。

 

三:条件查询:主要用了Criteria,Criterion接口,Expression和Restrictions类组成。

UserDaoImpl.java

 1 @Override
 2     public List<?> findUser(Class<?> cls, String userName) {
 3         Session session = null;
 4         Transaction tx = null;
 5         List<?> list=null;
 6         try {
 7             session=HibernateUtils.getSessionFactory().openSession();
 8             tx=session.beginTransaction();
 9             //通过session的createCriteria()方法创建Criteria对象
10             Criteria criteria = session.createCriteria(cls);
11             //设定查询条件
12             //(String propertyName, String value, MatchMode matchMode)
13             /*      MatchMode.START:字符串在最前面的位置.相当于"like 'value%'"
14                     MatchMode.END:字符串在最后面的位置.相当于"like '%value'"
15                     MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%value%'"
16                     MatchMode.EXACT:字符串精确匹配.相当于"like 'value'"           */
17             criteria.add(Restrictions.like("userName", userName, MatchMode.ANYWHERE));
18             //调用Criteria类的list()方法执行查询
19             list = criteria.list();
20             tx.commit();
21
22         } catch (Exception e) {
23             e.printStackTrace();
24             tx.rollback();
25         }finally{
26             session.close();
27         }
28         return list;
29     }

 

通过以上可以看出使用这个方法来查询数据有个局限就是要在session的条件下才可以。所以我们通常是使用离线条件查询

离线条件查询:DetachedCriteria(离线条件查询),可以脱离Session对象单独存在。(在项目中也多用离线条件查询)。

示例:

 1 @Override
 2     public List<?> findUser(Class<?> cls, String userName) {
 3         Session session = null;
 4         Transaction tx = null;
 5         List<?> list=null;
 6         try {
 7             session=HibernateUtils.getSessionFactory().openSession();
 8             tx=session.beginTransaction();
 9             DetachedCriteria dc=DetachedCriteria.forClass(cls);
10             //创建条件查询
11             dc.add(Restrictions.eq("userName", "kitty"));
12             //绑定当前的session
13             Criteria c=dc.getExecutableCriteria(session);
14             list=c.list();
15            tx.commit();
16
17         } catch (Exception e) {
18             e.printStackTrace();
19             tx.rollback();
20         }finally{
21             session.close();
22         }
23         return list;
24     }

Restrictions常用限定查询方法:

Restrictions.eq 等于

Restrictions.allEq 使用Map,使用key/value进行多个等于的比对

Restrictions.gt 大于 >

Restrictions.ge 大于等于 >=

Restrictions.lt 小于 <

Restrictions.le 小于等于 <=

Restrictions.between 对应SQL的BETWEEN子句

Restrictions.like 对应SQL的LIKE子句

Restrictions.in 对应SQL的in子句

Restrictions.and and关系

Restrictions.or or关系

四:本地SQL查询

对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行Session.createSQLQuery()获取这个接口。

String sql="select * from t_user";
SQLQuery query=session.createSQLQuery(sql);
query.addEntity(UserBean.class);
list=query.list();

 

 

时间: 2024-10-06 12:52:06

Hibernate 分页 查询的相关文章

关于hibernate分页查询的问题

问题描述 public List<News> getPageData(int startIndex, int pageSize) {Query q = HibernateSessionFactory.getSession().createQuery("from News n order by n.postTime desc");q.setFirstResult(startIndex);q.setMaxResults(pageSize);List<News> ne

Hibernate实现分页查询的简要分析

本文向大家介绍Hibernate查询分页,可能好多人还不了解Hibernate查询分页,没有关系,下面有一个例子,从第2万条开始取出100条记录看完本文你肯定有不少收获,希望本文能教会你更多东西. Java代码 Query q = session.createQuery("from Cat as c");; q.setFirstResult(20000);; q.setMaxResults(100);; List l = q.list();; 那么Hibernate底层如何实现分页的呢

实现在Hibernate中的分页查询原理解读

Hibernate 可以实现分页查询,例如: 从第2万条开始取出100条记录 Query q = session.createQuery("from Cat as c"); q.setFirstResult(20000); q.setMaxResults(100); List l = q.list(); 那么Hibernate底层如何实现分页的呢?实际上Hibernate的查询定义在net.sf.hibernate.loader.Loader这个类里面,仔细阅读该类代码,就可以把问题彻

hibernate+struts2分页查询的问题

问题描述 struts.xml<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN""http://struts.apache.org/dtds/struts-2.0.dtd"><struts><packag

hibernate分页算法-hibernate分页时查询出了15条数据,一页显示10条,其余5条不显示

问题描述 hibernate分页时查询出了15条数据,一页显示10条,其余5条不显示 query.setFirstResult((pageNo-1)*10); query.setMaxResults(10); 在使用这个分页算法的时候我用模糊查询一共查处了15条数据,第一页显示了10,但为什么其余5条显示不出来 if("down".equals(flag)) { pageNo=(Integer)session.get("pageNo"); System.out.pr

Hibernate查询,返回new对象(注意这个新定义的类要有构造函数),使用sql带条件分页查询并且把结果显示到一个对象的集里面的解决方案

 IIndexDao package com.ucap.netcheck.dao; import com.ucap.netcheck.combination.beans.IndexCombinationBean;import com.ucap.netcheck.common.Page;import com.ucap.netcheck.common.dao.GenericDao;import com.ucap.netcheck.entity.Site; /**    * @Title: IIn

小结Hibernate的查询方式

1. get() and load() session.get(Clazz, id); session.load(Clazz, id); 说明: load()与get()的区别 请注意如果没有匹配的数据库记录,load()方法可能抛出无法恢复的异常(unrecoverable exception). 如果类的映射使用了代理(proxy),load()方法会返回一个未初始化的代理,直到你调用该代理的某方法时才会去访问数据库. 若你希望在某对象中创建一个指向另一个对象的关联,又不想在从数据库中装载该

javaweb-关于hibernate条件查询问题。

问题描述 关于hibernate条件查询问题. 查,一张表 条件1:按时间降序 条件2:查询某一段的数据,如A,B,C,D,E (要求查C到D 这段数据) 条件3:查询的过程中,还会有新数据不断的插入 之前我想过直接上分页,可是分页 的话出现条件3的情况就不符合需求. 因为,假如现在有A,B,C,D,E 四条数据已经按时间降序了 现在第一页,每页显示2条吧,第一页出现就是A,B:第二页出现就是C,D 这时候如果突然插入一条新数据 "N" ,那这时候就出问题了,因为按照 时间降序,数据为

第十一章 Hibernate的查询 Query by Criteria(QBC)

QBC(QueryByCriteria)查询方式是Hibernate提供的"更加面向对象"的一种检索方式.QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句.  1.在Hibernate应用中使用QBC查询通常经过3个步骤 (1)使用Session实例的createCriteria()方法创建Criteria对象  (2)使用工具类Restrictions的相关方法为Criteria对象设置查询对象  (3)使用Criteria对象的list()方法执行查询,返回查