HQL查詢的幾種常見方式

Hibernate提供瞭如下幾種檢索對象的方式數據庫

--導航對象圖檢索方式:根據已經加載的對象導航。
--OID檢索方式:按照對象的OID來檢索對象。
--HQL檢索方式:使用面向對象的HQL查詢語言
--QBC檢索方式:使用QBC(Query By Criteria) API來檢索對象,編程

   這種API封裝了基於字符串形式的查詢語句,提供了更加面向對象的查詢接口。數組

--離線條件查詢
--本地SQL檢索方式:使用本地數據庫的SQL查詢語句。session

===============================================函數

HQL(Hibernate Query Language)是面向對象的查詢語言,它和SQL查詢語言有些類似,
在HIbernate提供的各類檢索方式中,HQL是使用最廣的一種檢索方式,它有以下功能:
--在查詢語句中設定各類查詢條件
--支持投影查詢,即僅檢索出對象的部分屬性
--支持分頁查詢
--支持鏈接查詢
--支持分組查詢,容許使用HAVING和GROUP BY關鍵字
--提供內置彙集函數,如sum(),min()和max()
--支持子查詢
--支持動態綁定參數
--可以調用用戶定義的SQL函數或標準函數。spa


HQL檢索方式(1)翻譯

HQL檢索方式包括如下步驟
--經過Session的createQuery()方法構建一個Query對象,它包括一個HQL查詢語句,
   HQL查詢語句中能夠包含命名參數
--動態綁定參數
--調用Query相關方法執行查詢語句,Query接口支持方法鏈編程風格,xml

   它的setXxx()方法返回實例自己,而不是void類型。對象

HQL與SQL比較
--HQL查詢語句是面向對象的,Hibernate負責解析HQL查詢語句,而後根據
對象-關係映射文件中的映射信息,把HQL查詢語句翻譯成相應的SQL語句,
HQL查詢語句中的主體是域模型中的類及類的屬性
--SQL查詢語句與關係數據庫綁定在一塊兒的,SQL查詢語句中主體是數據庫表及表的字段。
綁定參數:
--Hibernate的參數機制依賴於JDBC API中的PreparedStatement
的預約義SQL語句功能。排序

=====================================================================
HQL的參數綁定由兩種形式:
*按參數名字綁定:在HQL查詢語句中定義命名參數,命名參數以「:」開頭,
*按參數位置綁定:在HQL查詢語句中用「?」來定義參數位置。
--相關方法:
*setEntity():把參數與一個持久化類綁定
*setParameter():綁定任意類型的參數,該方法的第三個參數
顯式指定Hibernate映射類型。
--HQL採用ORDER BY關鍵字對查詢結果排序。

在映射文件中定義命名查詢語句
--Hibernate容許在映射文件中定義字符串形式的查詢語句。
--<query>元素用於定義一個HQL查詢語句,它和<class>元素並列
<query name="salaryEmps">
<![CDATA[
From Employee a WHERE e.salary > :minSal And e.salary < :maxSal
]]
</query>

--在程序中經過Session的getNamedQuery()方法獲取查詢語句對應的Query對象。

命名參數查詢容許咱們將HQL語句寫在*.hbm.xml中。
=====================================================================

投影查詢:
--查詢結果僅包含實體的部分屬性,經過SELECT關鍵字實現。
--Query的list()方法返回的集合中包含的是數組類型的元素,
每一個對象數組表明查詢結果的一條記錄
@Test
public void testFieldQuery(){
String hql = "SELECT e.email, e.salary, e.dept FROM Employee e WHERE e.dept = :dept";

Query query = session.createQuery(hql);

Department dept = new Department();
dept.setId(80);
List<Object[]> result = query.setEntity("dept",dept);
for(Object[] objs : result){
System.out.println(Arrays.asList(objs));
}
}

--能夠在持久化類中定義一個對象的構造器來包裝投影查詢
返回的記錄,使程序代碼能徹底運用面向對象的語義來訪問查詢結果集。

@Test
public void testFieldQuery(){

/**
*對應的實體類Employee中須要無參構造器,和與HQL語句中對象構造器
*傳入的參數對應的構造器。
*/
String hql = "SELECT new Employee(e.email,e.salary,e.dept)"+
+"FROM Employee e "
+"WHERE e.dept = :dept";

Query query = session.createQuery(hql);

Department dept = new Department();
dept.setId(80);
List<Employee> result = query.setEntity("dept",dept);
for(Employee emp : result){
System.out.println(emp.getId()+","+emp.getEmail);
}
}
--能夠經過DISTINCT關鍵字來保證查詢結果不會返回重複元素。
=========================================================
離線查詢
--離線查詢就是創建一個DetachedCriteria對象,將查詢的條件等指定好,而後在
session.beginTransaction()後將這個對象傳入。一般這個對象能夠在表示層建
立,而後傳入業務層進行查詢。
示例:
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(User.class);
detachedCriteria.add(Restrictions.eq("name","ijse");
Session session = SessionFactory.getCurrentSession();
User user = new User();
Transaction ts = session.beginTransaction();
try {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
user= (User) criteria.list().get(0);
session.commit();
}catch (HibernateException ex) {
ts.rollBack();
ex.printStackTrace();
}
System.out.println(user.getName());

==========================================================
報表查詢
報表查詢用於對數據分組和統計,與SQL同樣,HQL利用GROUP BY 關鍵字對數據分組,用HAVING關鍵字對分組數據設定約束條件。
在HQL查詢語句中能夠調用如下彙集函數
--count()
--min()
--max()
--sum()
--avg()
===========================================================
HQL(迫切)左外鏈接
*迫切左外鏈接:
--LEFT JOIN FETCH關鍵字表示迫切左外鏈接檢索策略。
--list()方法返回的集合中存放實體對象的引用,每一個Department對象關聯
的Employee集合都被初始化,存放全部關聯的Employee的實體對象。
-查詢結果中可能會包含重複元素,能夠經過一個HashSet來過濾重複元素。

左外鏈接:
--LEFT JOIN 關鍵字表示左外鏈接查詢。
--list()方法返回的集合中存放的是對象數組類型。
--根據配置文件來決定Employee集合的檢索策略。
--若是但願list()方法返回的集合中僅包含Department對象,能夠HQL查詢
語句中使用SELECT關鍵字
============================================================

關聯級別運行時的檢索策略--若是在HQL中沒有顯示指定檢索策略,將使用映射文件配置的檢索策略。--HQL會忽略映射文件中設置的迫切左外鏈接檢索策略,若是但願 HQL採用迫切左外鏈接策略,就必須在HQL查詢語句中顯式的指定它。--若在HQL代碼中顯式指定了檢索策略,就會覆蓋映射文件中配置的檢索 策略。

相關文章
相關標籤/搜索