標籤:style blog color io 使用 ar for 檔案 資料
HQL是面向持久化類的,所以需要查詢表的欄位都要用持久化類指定
例如
String hql = "SELECT e.email, e.salary, e.dept FROM Employee e WHERE e.dept = :dept"; Query query = session.createQuery(hql);
我們要查詢表Employees的Email欄位,但是我們不能直接select Email from empolyees,而是要通過持久化類來指定
SELECT e.email FROM Employee e
這也是HQL好處之一,面向持久化類,不面向資料褲,進而無論你換了其它什麼資料庫,語句還是可以正常運行
這一點要謹記
1分頁查詢:
setFirstResult(int firstResult): 設定從哪一個對象開始檢索, 參數 firstResult 表示這個對象在查詢結果中的索引位置, 索引位置的起始值為 0. 預設情況下, Query 從查詢結果中的第一個對象開始檢索 (setFirstResult=BeginData,,就是從第幾條記錄開始查詢)
setMaxResults(int maxResults): 設定一次最多檢索出的對象的數目. 在預設情況下, Query 和 Criteria 介面檢索出查詢結果中所有的對象 有了這兩個,不用管底層資料庫是怎樣實現的 setMaxResults=pageSize(設定了每頁顯示的記錄數)
example:
@Test public void testPageQuery(){ String hql = "FROM Employee"; Query query = session.createQuery(hql); int pageNo = 22; int pageSize = 5; //顯示第21頁的記錄,當setMaxResults設定值後,也就規定了資料表的記錄分為多少頁了 List<Employee> emps =query.setFirstResult((pageNo - 1) * pageSize) .setMaxResults(pageSize) .list(); System.out.println(emps); }
2在對應檔中定義命名查詢語句
Hibernate 允許在對應檔中定義字串形式的查詢語句.
<query> 元素用於定義一個 HQL 查詢語句, 它和 <class> 元素並列. 因為了是在xml檔案中定義,為了盡量不引起歧義,所以HQL語句盡量儲存在<![cdata[這裡]]>這一點需要特別的注意 樣本:
<query name="salaryEmps"><![CDATA[FROM Employee e WHERE e.salary > :minSal AND e.salary < :maxSal]]></query>
在程式中通過 Session 的 getNamedQuery() 方法擷取查詢語句對應的 Query 對象.
@Test public void testNamedQuery(){ Query query = session.getNamedQuery("salaryEmps");//取得在.hbm.xml檔案定義的HQL語句 List<Employee> emps = query.setFloat("minSal", 5000) .setFloat("maxSal", 10000) .list(); System.out.println(emps.size()); }
3投影查詢
投影查詢: 查詢結果僅包含實體的部分屬性. 通過 SELECT 關鍵字實現.,就是查詢部分屬性(select那裡聲明,與SQL一樣)
1做法一:Query 的 list() 方法返回的是集合數群組類型的元素(就是list方法返回了一個list對象), 每個對象數組代表查詢結果的一條記錄(所以必須用list<Objec[]>來儲存)
example:
@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對象,所以要用list<object []>數組儲存起來 List<Object[]> result = query.setEntity("dept", dept) .list(); for(Object [] objs: result){ System.out.println(Arrays.asList(objs)); } }
2做法二:可以在持久化類中定義一個對象的構造器來封裝投影查詢返回的記錄,也就是說咋們返回多少個參數,就定義一個該對象對應的參數構造器,把返回的資料封裝到一個對象裡,這樣更加容易遍曆 使程式碼能完全運用物件導向的語義來訪問查詢結果集.
example:
@Test public void testFieldQuery2(){
//把返回的參數都封裝給一個employee對象,但是前提必須要有對應的構造器 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) .list(); for(Employee emp: result){ System.out.println(emp.getId() + ", " + emp.getEmail() + ", " + emp.getSalary() + ", " + emp.getDept()); } }
可以通過 DISTINCT 關鍵字來保證查詢結果不會返回重複元素
4報表查詢
報表查詢(就是對資料排序,分組,進行一定的篩選)
報表查詢用於對資料分組和統計, 與 SQL 一樣, HQL 利用 GROUP BY 關鍵字對資料分組, 用 HAVING 關鍵字對分組資料設定約束條件.(這些關鍵字的用法和SQL一樣所以沒啥好說的)
在 HQL 查詢語句中可以調用以下聚集合函式 count() min() max() sum() avg()
example:
@Test public void testGroupBy(){
//用"+"號串連HQL語句時記得要用雙引號(""), String hql = "SELECT min(e.salary), max(e.salary) " + "FROM Employee e " + "GROUP BY e.dept " + "HAVING min(salary) > :minSal"; Query query = session.createQuery(hql) .setFloat("minSal", 8000); List<Object []> result = query.list(); for(Object [] objs: result){ System.out.println(Arrays.asList(objs)); } }
5(迫切)左外串連
左外串連:顯示join左邊表的所有資料,也就是from 那個表,比如 from student left join teacher on s_id=t_id顯示student的所有資料,teacher中不合格資料將被顯示為null
迫切左外串連: (推薦在查詢資料時使用這個)
1)LEFT JOIN FETCH 關鍵字表示迫切左外串連檢索策略. (就是fetch取值為join)
2)list() 方法返回的集合中存放實體物件的引用, 每個 Department 對象關聯的 Employee 集合都被初始化, 存放所有關聯的Employee 的實體物件.
3)查詢結果中可能會包含重複元素, 可以通過一個 HashSet或者 DISTINCT 來過濾重複元素
左外串連:
1)LEFT JOIN 關鍵字表示左外串連查詢.
2)list() 方法返回的集合中存放的是對象數群組類型
(集合對象是被初始化了,但是集合對象的對象沒有被初始化,)
例如list<department>,而department中又有一個employee對象,此時department對象已經被初始化了,而employee對象並沒有被初始化
也可以這樣理解串連的右表對象並沒有被初始化,例如:
from department left join employee on d_id=e_id
也就說此時department對象被初始化了,employee對象沒有被初始化,
3)根據設定檔來決定 Employee 集合的檢索策略.(fetch的取值)
4)如果希望 list() 方法返回的集合中僅包含 Department 對象, 可以在HQL 查詢語句中使用 SELECT 關鍵字
6(迫切)內串連
內串連:兩個表的記錄同時符合串連條件才會被顯樣本如:from student left join teacher on s_id=t_idstudent和teacher的記錄同時符合條件才會被顯示
迫切內串連:
INNER JOIN FETCH 關鍵字表示迫切內串連, 也可以省略 INNER 關鍵字
list() 方法返回的集合中存放 Department 對象的引用, 每個 Department 對象的 Employee 集合都被初始化, 存放所有關聯的 Employee 對象
內串連:
INNER JOIN 關鍵字表示內串連, 也可以省略 INNER 關鍵字
list() 方法的集合中存放的每個元素對應查詢結果的一條記錄, 每個元素都是對象數群組類型 如果希望 list() 方法的返回的集合僅包含 Department 對象, 可以在 HQL 查詢語句中使用 SELECT 關鍵字
關聯層級策略
如果在 HQL 中沒有顯式指定檢索策略, 將使用對應檔配置的檢索策略. HQL 會忽略對應檔中設定的迫切左外串連檢索策略, 如果希望 HQL 採用迫切左外串連策略, 就必須在 HQL 查詢語句中顯式的指定它 若在 HQL 代碼中顯式指定了檢索策略, 就會覆蓋對應檔中配置的檢索策略
HQL的檢索方式