成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hibernate HQL查詢解析

開發 后端
本文介紹了Hibernate HQL查詢,分為簡單屬性查詢、實體對象查詢、條件查詢、直接使用spl進行查詢等八種進行介紹。

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

* 單一屬性查詢,返回結果集屬性列表,元素類型和實體類中相應的屬性類型一致

* 多個屬性查詢,返回的集合元素是對象數組,數組元素的類型和對應的屬性在實體類中的類型一致
   數組的長度取決與select中屬性的個數
 
* 如果認為返回數組不夠對象化,可以采用HQL動態實例化Student對象

2、Hibernate HQL查詢:實體對象查詢
 
* N + 1問題,在默認情況下,使用query.iterate查詢,有可以能出現N+1問題,所謂的N+1是在查詢的時候發出了N+1條sql語句,1: 首先發出一條查詢對象id列表的sql,N: 根據id列表到緩存中查詢,如果緩存中不存在與之匹配的數據,那么會根據id發出相應的sql語句

* list和iterate的區別?
 
* list每次都會發出sql語句,list會向緩存中放入數據,而不利用緩存中的數據
 
* iterate:在默認情況下iterate利用緩存數據,但如果緩存中不存在數據有可以能出現N+1問題

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

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

* 可以采用 ?來傳遞參數(索引從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. //可以使用?方式傳遞參數      
  4. //參數的索引從0開始      
  5. //傳遞的參數值,不用單引號引起來      
  6. //注意方法鏈編程    

* 可以采用 :參數名 來傳遞參數

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();    

* 如果傳遞多個參數,可以采用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[]{12345}).list();    

* 在HQL中可以使用數據庫的函數,如: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創建的學生      
  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進行查詢

Java代碼:

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


不會返回對象,而是所有屬性!  


5、Hibernate HQL查詢:分頁查詢

* setFirstResult(),從0開始

* setMaxResults,每頁顯示多少條數據

Java代碼:

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

6、Hibernate HQL查詢:對象導航查詢,在HQL中采用 . 進行導航

7、Hibernate HQL查詢:連接查詢

* 內連

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查詢:統計查詢

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風格的操作(盡量少用,因為和緩存不同步)

Java代碼:

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

應當盡量少用,因為和緩存不同步,也就是說,假如在執行上面的語句之前,已經把student封裝成一個list曾經拿了出來,再執行上面的語句對 student中的表進行數據更新,然后再list Student表,則此時的list是從緩存中取的數據,而不是從表中找到的數據,也就是說,list拿到的是update前的數據,所以造成了這種不同步,所以這種風格盡量少用。

從這個方面也可以看得出Hibernate并不適用于聚集性,統計,大量批量的更新,刪除等操作。

 

 

【編輯推薦】

  1. 強人Hibernate文檔筆記(上)
  2. 強人Hibernate文檔筆記(中)
  3. 強人Hibernate文檔筆記(下)
  4. Hibernate一對多關系的處理
  5. Hibernate的性能優化
責任編輯:仲衡 來源: 自由呼吸博客
相關推薦

2009-09-23 18:05:48

2009-09-25 16:57:49

Hibernate查詢

2009-06-12 15:32:01

Hibernate H

2009-06-26 16:09:21

Hibernate查詢HQL

2014-05-12 10:37:41

2009-06-29 18:26:46

HibernateHQL查詢

2009-06-11 14:40:59

Hibernate分頁Hibernate查詢

2009-09-27 14:56:22

Hibernate H

2009-06-12 15:09:01

Hibernate優化

2009-09-23 15:12:41

Hibernate視圖

2009-06-16 16:27:22

Hibernate優化

2009-09-24 15:27:41

Hibernate查詢

2009-06-17 08:47:00

Hibernate優化

2009-09-22 08:39:59

Hibernate F

2009-06-26 10:01:00

Hibernate的查

2009-09-27 10:19:11

Hibernate命名

2009-09-29 16:29:40

Hibernate查詢

2009-06-18 09:47:50

2009-06-30 16:55:19

2009-06-08 10:20:01

Hibernate查詢
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产一区二区三区免费观看视频 | 成人午夜毛片 | 久久日韩精品一区二区三区 | 中文亚洲字幕 | 国产激情视频网站 | 久久99精品久久久久久狂牛 | 久草福利| 黄色网络在线观看 | 欧美午夜精品 | 亚洲视频免费在线观看 | www国产成人免费观看视频,深夜成人网 | 在线一区二区三区 | 超碰成人av | 亚洲一区电影 | 亚洲天堂一区二区 | 欧美日韩成人一区二区 | 91久久久久久久久 | 日韩精品视频一区二区三区 | 国产一级特黄视频 | 日韩精品一区二区三区视频播放 | 欧美三级成人理伦 | 亚洲婷婷六月天 | 国产精品三级久久久久久电影 | 国产高清久久久 | 成人午夜黄色 | 久久av一区二区三区 | 久久精品久久综合 | 欧美精品日韩精品 | 欧美vide| 91精品在线播放 | 国产视频1区 | 亚洲自拍偷拍免费视频 | 亚洲免费精品 | 热99视频 | 色www精品视频在线观看 | xxxxxx国产| 国产精品久久久久久久久久免费看 | 成人免费看 | 国产成人99av超碰超爽 | 久久久高清 | 国产精品久久久久一区二区三区 |