日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
HibernateHQL查詢解析

在HQL中關(guān)鍵字不區(qū)分大小寫,但是屬性和類名區(qū)分大小寫,下面介紹各種類型的Hibernate的HQL查詢。
1、Hibernate HQL查詢:簡(jiǎn)單屬性查詢

站在用戶的角度思考問題,與客戶深入溝通,找到柳河網(wǎng)站設(shè)計(jì)與柳河網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名與空間、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋柳河地區(qū)。

* 單一屬性查詢,返回結(jié)果集屬性列表,元素類型和實(shí)體類中相應(yīng)的屬性類型一致

* 多個(gè)屬性查詢,返回的集合元素是對(duì)象數(shù)組,數(shù)組元素的類型和對(duì)應(yīng)的屬性在實(shí)體類中的類型一致
   數(shù)組的長(zhǎng)度取決與select中屬性的個(gè)數(shù)
 
* 如果認(rèn)為返回?cái)?shù)組不夠?qū)ο蠡梢圆捎肏QL動(dòng)態(tài)實(shí)例化Student對(duì)象

2、Hibernate HQL查詢:實(shí)體對(duì)象查詢
 
* N + 1問題,在默認(rèn)情況下,使用query.iterate查詢,有可以能出現(xiàn)N+1問題,所謂的N+1是在查詢的時(shí)候發(fā)出了N+1條sql語句,1: 首先發(fā)出一條查詢對(duì)象id列表的sql,N: 根據(jù)id列表到緩存中查詢,如果緩存中不存在與之匹配的數(shù)據(jù),那么會(huì)根據(jù)id發(fā)出相應(yīng)的sql語句

* list和iterate的區(qū)別?
 
* list每次都會(huì)發(fā)出sql語句,list會(huì)向緩存中放入數(shù)據(jù),而不利用緩存中的數(shù)據(jù)
 
* iterate:在默認(rèn)情況下iterate利用緩存數(shù)據(jù),但如果緩存中不存在數(shù)據(jù)有可以能出現(xiàn)N+1問題

3、Hibernate HQL查詢:條件查詢
 
* 可以采用拼字符串的方式傳遞參數(shù)
 
Java代碼:

 
 
 
  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where s.name like '%1%'").list();    

* 可以采用 ?來傳遞參數(shù)(索引從0開始)
 
Java代碼:

 
 
 
  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where s.name like ?").setParameter(0, "%1%").list();      
  3. //可以使用?方式傳遞參數(shù)      
  4. //參數(shù)的索引從0開始      
  5. //傳遞的參數(shù)值,不用單引號(hào)引起來      
  6. //注意方法鏈編程    

* 可以采用 :參數(shù)名 來傳遞參數(shù)

Java代碼:

 
 
 
  1. List students = session.createQuery  
  2. ("select s.id, s.name from Student s where s.name like :myname").
  3. setParameter("myname", "%1%").list();    

* 如果傳遞多個(gè)參數(shù),可以采用setParamterList方法

Java代碼:

 
 
 
  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where s.id in(:myids)").
  3. setParameterList("myids", new Object[]{1, 2, 3, 4, 5}).list();    

* 在HQL中可以使用數(shù)據(jù)庫的函數(shù),如:date_format

Java代碼:

 
 
 
  1. List students = session.createQuery
  2. ("select s.id, s.name from Student s where date_format(s.createTime, '%Y-%m')=?").
  3. setParameter(0, "2008-02").list();      
  4. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");      
  5.          
  6.    //查詢2008-01-10到2008-02-15創(chuàng)建的學(xué)生      
  7.     List students = session.createQuery
  8. ("select s.id, s.name from Student s where s.createTime between ? and ?")      
  9.           .setParameter(0, sdf.parse("2008-01-10 00:00:00"))      
  10.           .setParameter(1, sdf.parse("2008-02-15 23:59:59"))      
  11.                 .list();     

4、Hibernate HQL查詢:直接使用sql進(jìn)行查詢

Java代碼:

 
 
 
  1. List students = session.createSQLQuery("select * from t_student").list();    

不會(huì)返回對(duì)象,而是所有屬性!  

5、Hibernate HQL查詢:分頁查詢

* setFirstResult(),從0開始

* setMaxResults,每頁顯示多少條數(shù)據(jù)

Java代碼:

 
 
 
  1. List students = session.createQuery("from Student")      
  2.           .setFirstResult(1)      
  3.           .setMaxResults(2)      
  4.           .list();    

6、Hibernate HQL查詢:對(duì)象導(dǎo)航查詢,在HQL中采用 . 進(jìn)行導(dǎo)航

7、Hibernate HQL查詢:連接查詢

* 內(nèi)連

Sql代碼:

 
 
 
  1. SELECT s.name, c.name FROM Student s (inner) join s.classes c    

* 外連接(左連接/右連接)
 
Sql代碼:

 
 
 
  1. SELECT s.name, c.name FROM Student s left join s.classes c    

8、Hibernate HQL查詢:統(tǒng)計(jì)查詢

Java代碼:

 
 
 
  1. List students =session.createQuery
  2. ("select c.name, count(s) from Student s join s.classes c " 
  3. +"group by c.name order by c.name").list();      
  4. for (Iterator iter=students.iterator(); iter.hasNext();) {      
  5.      Object[] obj = (Object[])iter.next();      
  6.      System.out.println(obj[0] + ", " + obj[1]);      
  7. }    

9、DML風(fēng)格的操作(盡量少用,因?yàn)楹途彺娌煌剑?/strong>

Java代碼:

 
 
 
  1. session.createQuery  
  2. ("update Student s set s.name=? where s.id < ?")      
  3.                      .setParameter(0, "李四")      
  4.                      .setParameter(1, 5)      
  5.                      .executeUpdate();    

應(yīng)當(dāng)盡量少用,因?yàn)楹途彺娌煌?,也就是說,假如在執(zhí)行上面的語句之前,已經(jīng)把student封裝成一個(gè)list曾經(jīng)拿了出來,再執(zhí)行上面的語句對(duì) student中的表進(jìn)行數(shù)據(jù)更新,然后再list Student表,則此時(shí)的list是從緩存中取的數(shù)據(jù),而不是從表中找到的數(shù)據(jù),也就是說,list拿到的是update前的數(shù)據(jù),所以造成了這種不同步,所以這種風(fēng)格盡量少用。

從這個(gè)方面也可以看得出Hibernate并不適用于聚集性,統(tǒng)計(jì),大量批量的更新,刪除等操作。


文章標(biāo)題:HibernateHQL查詢解析
網(wǎng)頁URL:http://www.dlmjj.cn/article/ccedcjo.html