HQL查詢
HQL查詢:簡單屬性查詢:
1.單一屬性查詢,返回屬性結果集列表,元素類型和實體類中相應的屬性類型一致。
2.多個屬性查詢,多個屬性查詢返回的是對象數組,對象數組的長度取決於屬性的個數,對象數組中元素的類型取決於屬性在實體類中屬性的類型。 (我們可以使用增強for循環結合數組下標來獲得屬性具體信息)
3.如果覺得返回數組不夠對象化,那麼我們可以在實體中構造我們需要的構造方法,來獲得我們需要的實體對象。
HQL查詢:對象實體查詢:
N + 1問題,就是發出了N+1條sql語句
1:首先發出查詢對象id列表的語句
N:根據id到緩存中查詢,如果緩存中不存在與之匹配的數據,那麼會根據id發出相應的sql語句
list和iterate的區別?
list: 默認情況下list每次都會發出sql語句,list會將數據放到緩存中,而不利用緩存
iterate:默認情況下iterate利用緩存,如果緩存中不存在會出現N+1問題
備註:Hibernate4.x之後好像已經避免了N+1問題了吧。
HQL條件查詢:
1.可以採用拼字符串的方式傳遞參數(不推薦使用,就有點類似jdbc中的Statement)
2.可以採用? 填充佔位符的形式來添加參數(推薦使用,就類似jdbc中的PreapredStatement)
3.可以使用參數名來傳遞參數(類似於佔位符但是要符合一定格式比如 name=:myname) 不是特殊情況就不要使用這種方式,也沒看到有什麼好處。
4.如果傳遞多個參數,可以採用setParamterList方法:就當是一個小技巧吧,沒有它也能做。
5.在hql中可以使用數據庫函數 如:date_format
備註:填充佔位符的時候:索引下標是從0開始的,jdbc是從1開始的。
方法鏈式編程推薦使用
如果知道返回結果肯定是唯一的話,我們就不需要使用list()方法了,我們直接使用uniqueResult()方法
HQL查詢:直接使用原生SQL查詢
hibernate直接使用sql語句查詢
備註:它只是把HQL轉換爲SQL其它的所有都沒有變化。該怎麼用就怎麼用.
備註:如果遇到Hibernate性能瓶頸或是使用Hibernate的HQL實現太複雜的話,我們就需要考慮使用原生SQL了。
HQL查詢: 外置命名查詢
1.咋映射文件中使用<query>標籤定義hql (完全不推薦,除非是有什麼特殊要求)
2.在程序中使用session.getNamedQuery()方法得到hql查詢串。
HQL查詢: 查詢過濾器
1.在映射文件中定義過濾參數
2.在類的映射中使用過濾參數
3.在程序中必須顯示的啓用過來長期,並且爲過濾器參數賦值
HQL查詢: 分頁查詢
1.setFirstResult(),從哪開始
2.setMaxResults(),每頁顯示的記錄數
分頁查詢很重要,一定要很掌握。
HQL查詢:對象導航查詢
有時候它使用起來比SQL更方便。
HQL查詢:連接查詢
1.內連接 (即左右兩邊都有數據) 記錄是最少的
2.外連接 (分爲左外連接、右外連接)
按道理來說,外聯結應該還有一個全連接的,但是我並沒有在hibernate出發現,不過在Oracle中全外連接記錄是最多的。
HQL查詢:統計查詢
統計查詢(挺重要的)
備註:分組函數
HQL查詢:DML風格的操作(儘量少用,因爲和緩存不同步)
參考我自己寫的程序hibernate4.x項目
導出建表語句的方法:
Configuration cfg = new Configuration().configure();
SchemaExport export = new SchemaExport(cfg);
export.create(true, true);