主要由三種查詢:HQL查詢、Criteria條件查詢、SQL查詢。java
如下分別講解sql
1. HQL查詢數據庫
HQL(Hibernate Query Language)查詢提供了更加豐富和靈活的查詢特性,所以Hibernate將HQL查詢立爲官方推薦的標準查詢方式。express
HQL語法與SQL類似,但HQL是一種面向對象的查詢語言,操做的是類、實例和屬性等。數組
HQL是徹底面向對象的查詢語言,支持繼承和多態等特性。session
HQL查詢步驟函數
(1) 得到Hibernate Session對象工具
(2) 設計HQL查詢語句fetch
(3) 以HQL查詢語句做爲參數,調用Session.createQuery(hql)方法建立查詢對象ui
(4) 若是HQL查詢語句包含參數,調用Query的setXxxx()方法爲參數賦值
(5) 調用Query對象的list等方法遍歷查詢結果
public class HqlQueryTest{ private void findStudents(){ SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory(); Session session = sessionFactory.openSession(); Transaction trans = session.beginTransaction(); Query query = session.createQuery("FROM Student as stu WHERE stu.studentid=:sid"); query.setString("sid", "123456"); List list = query.list();for... trans.commit(); session.close(); sessionFactory.close(); } }
Query接口提供了綁定各類Hibernate映射類型的方法,
如:setBinary()/setString()/setBoolean()/setByte()/setCalendar()/setCharacter()/setDate()/setDouble()/setText()/setTime()/setTimestamp()。
還包含了兩個用於實現Hibernate分頁的方法:
① setFirstResult(int firstResult):設置返回的結果集從第幾條記錄開始;
② setMaxResults(int maxResults):設置本次查詢返回的結果數;
HQL語法分析
HQL語句自己不區分大小寫,但HQL中使用的包名、類型、實例名及屬性名都區分大小寫。
(1) FROM子句
from Student as st
該子句返回Student持久化類的全部實例,一般推薦起別名;
(2) SELECT子句
select子句選擇將哪些對象與屬性返回到查詢結果集中,固然選擇的屬性必須是from後持久化類包含的屬性。如:
SELECT st.name FROM Student as st
select能夠選擇任意屬性,不只能夠選擇持久化類的直接屬性,還能夠選擇引用屬性包含的屬性(關聯內容)。如:
SELECT st.class FROM Student as st
(3) 彙集函數
HQL查詢甚至能夠返回做用與屬性之上的彙集函數的計算結果,HQL支持的彙集函數與SQL徹底相同。有5種:
① avg:計算屬性平均值;
② count:統計選擇對象的數量;
③ max:統計屬性值的最大值;
④ min:統計屬性值的最小值;
⑤ sum:計算屬性值的總和;
如:
SELECT count(*) FROM Student
SELECT max(st.age) FROM Student as st
(4) 多態查詢
HQL語句被設計成能理解多態查詢,Hibernate能夠在from子句中指定任何Java類或接口,其from後跟的持久化類名不只會查詢出該持久化類的所有實力,還會查詢出該類中子類的所有實例。
如:FROM Student as st    //該查詢語句不只會查詢出Student的所有實例,還會查詢出Student的子類
(5) WHERE子句
where子句用於篩選選中的結果,以縮小選擇的範圍。
如: FROM Student as st WHERE st.name LIKE 「張%」
where子句中的屬性表達式必須以基本類型或java.lang.String結尾,不要使用引用類型屬性結尾。
如Student有class屬性,class有classname屬性:
FROM Student as st WHERE st.class.Classname LIKE 「td%」  //正確
FROM Student as st WHERE st.class LIKE 「td%」                   //不正確
(6) 表達式
HQL的表達式很是多,其where子句後支持的運算符也不少,不只包括SQL的運算符,也包括EJB-QL的運算符等。
在where子句中容許使用的表達式包括大多數能夠在SQL中使用的表達式。
· 數學運算符: + 、-、*、/  等
· 二進制比較運算符: =、<=、>=、<>、!=、like 等
· 邏輯運算符:and、or、not 等
· 判斷字:in、not in、between、is null、is not null、is empty、is not empty、memberof、not memberof 等
· 條件判斷:case、case…when…then…else…end 等
· 字符串鏈接符:value1 || value2或使用函數 concat(value1, value2)
· 時間操做函數:currentDate、currentTime、currentTimestamp、second、minute、hour、day、month、year 等
· HQL還支持EJB-QL3.0所支持的函數或操做substring、trim、lower、upper、Length、locate、abs、sqrt、bit_length和nullif 等
· 支持數據庫的類型轉換函數,如cast(…as….),第二個參數是Hibernate的類型名,或者extract(…from…),前提是底層數據庫支持ANSI cast和extract
· 若是底層數據庫支持單行函數sign、trunk、rtrim()、sin,則HQL語句也能夠徹底支持
· HQL語句支持使用「?」做爲參數佔位符,這與JDBC的參數佔位符一致,也可使用命名參數展位符號,方法是在參數名前加冒號「:」,如 :username、:xxx等
· 可在where子句中使用SQL常量,如「tfnew21」、6六、」2009-04-21」等
· 還能夠在HQL語句中使用Java public static final常量,如CC.Color.TABBY
在這些結構變量中:size、elements、ndices、minindex、maxindex、minelement、maxelement等只能在where子句中使用。
在where子句中,有序集合的元素(arrays、lists、maps)能夠經過「[]」運算符訪問。用法以下:
FROM Student as st where st.class[0].classname is not null
group by子句返回彙集值(Aggregate Values)的查詢能夠按照一個返回的類或組件(Components)中的任何屬性(Property)進行分組,能夠對持久化類或引用屬性的屬性進行分組,分組時可以使用group by子句。以下:
SELECT st.age, count(st.name) FROM Student as st GROUP BY st.age
相似於SQL的規則,出如今select後的屬性要麼出如今彙集函數中,要麼出如今group by的屬性列表中。
having子句用於對分組進行過濾,having子句只能在有group by子句時纔可使用。如:
SELECT st.age, count(st.name) FROM Student as st GROUP BY st.age HAVING st.age BETWEEN 21 AND 25;
根據查詢返回的列表(list),能夠按照一個返回的類或組件中的任何屬性用order by子句進行排序。
可使用ASC(升序)、DESC(降序)指定排序規則,沒有指定則默認採用升序規則。如:
FROM Student as st ORDER BY st.age DESC
group by和order by子句中都不能包含算數表達式。
對於集合屬性,Hibernate默認採用延遲加載策略。
例如,對於持久化類Student,有集合屬性class,加載Student實例時,默認不加載class屬性。若是Session被關閉,則Student實例將沒法訪問關聯的class屬性。
爲了解決該問題,能夠在Hibernate映射文件中取消延遲加載,或者使用fetch jion。如:
FROM Student as st FETCH JOIN st.class    //此處的fetch語句將會初始化Student的class集合屬性
若是使用了屬性級別的延遲加載,能夠用fetch all properties來強制Hibernate當即獲取那些本來須要延遲加載的屬性。如:
FROM Student FETCH ALL PROPERTIES WHERE age>12 ORDER BY age
HQL查詢還支持查詢所用的HQL語句放入配置文件中,而不是代碼中。經過這種方式,能夠大大提升程序設計的靈活度。以下:
<query name="getStudent」>
  FROM Student FETCH ALL PROPERTIES WHERE age>? ORDER BY age
</query>
在程序中調用命名查詢的方法爲:
Query query = session.getNamedQuery(「getStudent」);
query.setInteger(0, 21);
 
2. Creteria條件查詢
條件查詢是更具面向對象特點的數據查詢方式,經過如下三個類完成:
· Creteria:表明一次查詢
· Criterion:表明一個查詢條件
· Restrictions:產生查詢條件的工具類
執行條件查詢的步驟:
(1) 得到Hibernate的Session對象
(2) 以Session對象建立Criteria對象
(3) 增長Criterion查詢條件
(4) 執行Criteria的list等方法返回結果集
如:
//增長的限制條件必須是Student已經存在的屬性
Criteria cri = session.createCriteria(Student.class);
cri.add(Restrictions.gt(「studentid」, new Integer(123)));
List list = cri.list();
在條件查詢中,Criteria接口表明一次查詢,該查詢自己不具有任何的數據篩選功能。
調用createCriteria(Class class)方法對某個持久化類建立條件查詢實例。
Criteria經常使用方法
Criteria add(Criterion criterion):增長查詢條件;
Criteria addOrder(Order order):增長排序規則;
List list():返回結果集;
分頁查詢用的兩個方法:
Criteria setFirstResult(int firstResult):設置查詢返回的第一行記錄;
Criteria setMaxResult(int maxResult):設置查詢返回的記錄數;
Criterion接口表明一個查詢條件,該查詢條件由Restrictions負責產生,而Restrictions是專門用於產生查詢條件的工具類,它的方法大部分都是靜態方法。
經常使用的方法有以下幾種:
static Criterion allEq(Map propertyNameValues):判斷指定屬性(由Map參數的key指定)和指定值(由Map參數的value指定)是否徹底相等;
static Criterion between(String propertyName, Object obj1, Object obj2):判斷屬性值是否在某個值範圍以內;
static Criterion ilike(String propertyName, Object value):判斷屬性值是否匹配某個字符串;
static Criterion ilike(String propertyName, String value, MatchMode matchMode):判斷屬性值是否匹配某個字符串,並肯定匹配模式;
static Criterion in(String propertyName, Collection values):判斷屬性值是否在某個集合內;
static Criterion in(String propertyName, Object[] values):判斷屬性值是否數組元素的其中之一;
static Criterion isEmpty(String propertyName):判斷屬性值是否爲空;
static Criterion isNotEmpty(String propertyName):判斷屬性值是否不爲空;
static Criterion isNull(String propertyName):判斷屬性值是否不爲空;
static Criterion isNotNull(String propertyName):判斷屬性值是否不爲空;
static Criterion not(Criterion expression):對Criterion求否;
static Criterion sizeEq(String propertyName, int size):判斷某個屬性的元素個數是否與size相等;
static Criterion sqlRestriction(String sql):直接使用SQL語句做爲篩選條件;
static Criterion sqlRestriction(String sql, Object value, Type type):直接使用帶參數佔位符的SQL語句做爲條件,並指定參數值;
static Criterion sqlRestriction(String sql, Object[] value, Type[] type):直接使用帶參數佔位符的SQL語句做爲條件,並指定多個參數值;
若是須要使用關聯類的屬性來增長查詢條件,則應該對屬性再次使用createCriteria方法,用法以下:
session.cerateCriteria(Student.class)
  .add(Restriction.like(「name」, 「天風」)).createCriteria(「classes」).add(Restriction.like(「className」, 「班級名」)).list();
注意:查詢並非查詢class持久化類,而是查詢Student持久化類。
 
3. SQL查詢
Hibernate還支持使用SQL查詢,使用SQL查詢能夠利用某些數據庫的特性,或者用於將原有的JDBC應用移植到Hibernate應用上。
SQL查詢是經過SQLQuery接口來表示的,因爲SQLQuery接口是Query接口的子接口,所以徹底能夠調用Query接口的方法。
執行SQL查詢的步驟以下:
(1) 獲取Hibernate Session對象;
(2) 編寫SQL語句;
(3) 以SQL語句做爲參數,調用Session的createSQLQuery方法建立查詢對象;
(4) 若是SQL語句包含參數,則調用Query的setXxx方法爲參數賦值;
(5) 調用SQLQuery對象的addEntity或addScale方法將選出的結果與實體關聯;
(6) 調用Query的list方法返回查詢的結果集
使用以下:
List list = session.createSQLQuery(「SELECT {st.*} FROM student as st 」).addEntity(「st」, Student.class).list();
若是不使用{st.*}形式,就可以讓實體別名與表別名互不相同,關聯實體的類型時,被關聯的類必須有對應的setter方法。