Hibernate 分頁 查詢(hql不支持limit)


 分頁:

主要的代碼塊:(明天實現分頁的封裝)

復制代碼
 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();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM