中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Hibernate HQL查詢分為哪幾個

發布時間:2021-07-14 09:07:02 來源:億速云 閱讀:150 作者:chen 欄目:編程語言

本篇內容介紹了“Hibernate HQL查詢分為哪幾個”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

在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代碼:

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

* 可以采用 ?來傳遞參數(索引從0開始)

Java代碼:

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

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

Java代碼:

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

* 如果傳遞多個參數,可以采用setParamterList方法

Java代碼:

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

* 在HQL中可以使用數據庫的函數,如:date_format

Java代碼:

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

4、Hibernate HQL查詢:直接使用sql進行查詢

Java代碼:

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


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


5、Hibernate HQL查詢:分頁查詢

* setFirstResult(),從0開始

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

Java代碼:

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

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

7、Hibernate HQL查詢:連接查詢

* 內連

Sql代碼:

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

* 外連接(左連接/右連接)

Sql代碼:

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

8、Hibernate HQL查詢:統計查詢

Java代碼:

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

9、DML風格的操作(盡量少用,因為和緩存不同步)

Java代碼:

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

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

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

“Hibernate HQL查詢分為哪幾個”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

柳江县| 固安县| 鹰潭市| 叙永县| 曲靖市| 大足县| 蕉岭县| 龙门县| 瑞金市| 满城县| 荃湾区| 剑阁县| 高平市| 田林县| 乌拉特前旗| 商南县| 顺昌县| 衡阳县| 福泉市| 朝阳县| 平阴县| 登封市| 弥勒县| 盐山县| 泗阳县| 双辽市| 双城市| 永清县| 平谷区| 芦山县| 拉萨市| 潮州市| 广丰县| 西乌珠穆沁旗| 濮阳县| 临泉县| 嘉鱼县| 澄城县| 那坡县| 白城市| 朝阳市|