Hibernate Critiria 進階查詢
主題: |
Hibernate Criteria 進階查詢 |
文章簡介: |
介紹Hibernate Criteria標準查詢,透過簡單的範例,讓讀者了解Hibernate Criteria進階查詢的使用方式 |
作者: |
薛泰綸 |
版本/產出日期: |
3.0/2016.12.14 |
1. 前言
• 要操作資料庫最基本的就是使用SQL語法,Hibernate Criteria對SQL進行封裝,讓不了解SQL使用與撰寫的Java程式開發人員,以物件導向模型的方式,透過Hibernate Criteria所提供的API來進行SQL語句查詢。
• 本文將介紹Hibernate Criteriar進階查詢功能及使用方式。
• 開發工具使用Eclipse Java EE IDE Luna Service Release 2 (4.4.2) 。
• 本文件適用於Hibernate開發。
2. 目的
• 逐步了解Hibernate Criteria的進階查詢方式。
• 了解如何利用Hibernate Criteria開發應用程式。
3. 版本與環境
本架構建立於以下版本的環境:
• Eclipse Java EE IDE Luna Service Release 2 (4.4.2)
• JDK 7
• Hibernate 3
• Oracle PL/SQL Developer
4. Criteria進階查詢步驟與介紹:
• 進階查詢方式介紹及Demo:
注意: 如果想要設定查詢條件,則要使用Restrictions的各種靜態方法傳回Criteria實例,傳回的每個Criteria 實例代表著一個條件,您要使用Criteria的add()方法加入這些條件。
• 建立資料庫資料
如果對進階語法有疑問的話可以參考 Hibernate Criteria 基本查詢,
我的上一篇文章。
以下先介紹這次Demo的DB欄位資料。
DB欄位:
DB資料:
接著我們就可以Demo Critiria進階查詢:
• 進階查詢(設定條件,對應sql where enddate between ‘? and ‘?’)
※使用Critiria的時候不用另外加上Where的關鍵字。
※每一次對Critiria進行add方法的時候,都會自動幫你加上and 關鍵字。
Hibernate 建立的查詢語法:
查詢之後資料為:
• 設定SQL範本
如果您了解如何撰寫SQL語句,想要設定一些Hibernate產生SQL時的範本,您也可以使用Restrictions的sqlRestriction()方法,提供SQL語法範本作限定查詢,例如查詢title以no.6結尾的資料:
其中alias將被替換為與TestDataTable類別相關的名稱,而? 將被替換為%no.6,也就是第二個參數所提供的值,最後告訴hibernate 置換的參數的型態。
Hibernate 就幫我們產出了SQL:
查詢之後資料為:
如果有多個查詢條件(例如between)也可以使用相同方法範例如下:
需要使用陣列替換需要的參數。
下列為Hibernate產出的語法可以觀察一下。
查詢出來的資料如下:
• Hibernate 也提供統計方法
您可以對查詢結果進行統計動作,使用 org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min ()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入條件設定,例如對查詢結果的"startdate"作分組:
上面的程式將由Hibernate自動產生SQL的group by子句進行分組計算:
如果想同時結合統計與分組功能,則可以使用ProjectionList:
觀察所產生的SQL語句,將使用group by先進行分組,再針對每個分組進行count函數的計數:
這裡示範的都是對單一table進行操作,如果對多個table就要再hibernate裡面設定一對多或是多對一的佈署。
5. 總結
Hibernate 建議開發者使用他們的標準查詢語法,以及HQL語法,工程師在開發的過程中可以參考這些語法降低開發時間。
6. 參考來源
• Hibernate 官方網站
https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/Criteria.html
• 良葛格學習筆記
http://openhome.cc/Gossip/index.html
http://www.tpisoftware.com/tpu/
•Hibernate Critiria 基礎查詢