敘:在hibernate框架中查詢數據庫的語句主要分為HQL、QBC、SQL這三種,各有各的特點,使用的情況也不盡相同,之前關於HQL查詢方式的也有一些學習,但是並不全面,今天本章節輕風就HQL(Hibernate Query Language)查詢語句進行了詳細的學習;
HQL查詢數據
本章節主要學習的是HQL查詢方式的單表查詢,多表查詢在下一章節學習記錄;
HQL介紹
HQL(Hibernate Query Language):是hibernate的數據查詢方式,HQL是針對持久化對象的,它用來取得對象而不進行update、delete和insert等更新操作,是一種完全面向對象的查詢方式,並且具備繼承、多態和關聯等特性,因此在里面的查詢語句都是針對實體對象以及實體對象中的屬性的,不要搞混了;
幾種查詢方式
1. 簡單查詢
此查詢是hql的基本查詢方式,沒有任何修飾,查詢所有一張表的所有數據
代碼如下:
@Test /* * HQL的基本查詢 */ public void demo1() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); // String sql1 = "from com.java.domain.Customer";//全類名書寫 String sql = "from Customer";// 簡單書寫 Query cust = session.createQuery(sql); List<Customer> list = cust.list(); for (Customer customer : list) { System.out.println(customer); } bt.commit(); session.close(); }
HQL數據查詢是一面向對象的形式,因此,sql=”from Customer”;這句中的Customer是實體對象的名稱,而非數據庫表的名表名,關於實體類名有兩種書寫方式,一種是全類名,即:從src到類名,這種寫法是為了防止碰到相同類名的文件(一般情況下沒必要這么寫);第二種是直接寫類名的簡單書寫,這種是最常用的;
2. 排序查詢
排序查詢和基本查詢差別不大,主要是在查詢的類名后邊添加order by+排序依據的列名+排序方式,與sql語句的類似(asc是升序方式,desc是降序方式);
@Test /* * 排序查詢 */ public void demo2() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql = "from Customer order by cust_id desc";// asc:升序 desc:降序 Query cust = session.createQuery(sql); List<Customer> list = cust.list(); for (Customer customer : list) { System.out.println(customer); } bt.commit(); session.close(); }
3. 條件查詢
與sql語句類似,where后邊加上根據哪個列進行條件查詢,並通過占位符來進行查詢;
占位符存在兩種,一種是直接用問號,第二種是起代號,注意,起代號的方式需要在代號前加冒號;兩種操作如下所示:
@Test /* * 條件查詢 */ public void demo3() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); //String sql = "from Customer where cust_id=?";//通過問占位 String sql1 = "from Customer where cust_id=:id ";//通過“代號”占位 Query cust = session.createQuery(sql1); //cust.setParameter(0, 2l);//通過問號占位的從0開始排序 cust.setParameter("id", 2l); List list = cust.list(); System.out.println(list); bt.commit(); session.close(); }
問號占位符需要在setparameter中從0開始排序,
代號占位符需要在setparameter中先寫代號,再寫條件查詢的條件值;
4. 分頁查詢
分頁查詢只需要兩個關鍵字,setFirstResults()和setMaxresults(),第一個是起始索引值,第二個每頁最大顯示數據條數; (起始索引值 = (當前頁數-1)* 每頁顯示條數)
@Test /* * 分頁查詢 */ public void demo4() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql = "from Customer"; Query cust = session.createQuery(sql); //limit ?,? 索引起始 = (當前頁數-1)* 每頁要顯示的數據條數 cust.setFirstResult(2);//起始索引 cust.setMaxResults(2);//每頁顯示條數 List<Customer> list = cust.list(); for (Customer customer : list) { System.out.println(customer); } bt.commit(); session.close(); }
5. 統計查詢
統計查詢重點在於關鍵字,這個關鍵字和排序查詢一樣,都在查詢語句中,和分頁查詢的關鍵字不一樣,分頁查詢的關鍵字是在代碼中,不是在查詢語句中;
主要的幾個關鍵字:
- count 統計
- sum 求和
- avg 平均數
- max(min)最大值(最小值)
代碼:
@Test /* *統計查詢 */ public void demo5() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql_count = "select count(*) from Customer"; String sql_sum = "select sum(cust_id) from Customer"; String sql_avg = "select avg(cust_id) from Customer";//獲得的是double類型的返回值 String sql_max = "select max(cust_id) from Customer"; String sql_min = "select min(cust_id) from Customer"; Query cust = session.createQuery(sql_avg); Number uniqueResult = (Number) cust.uniqueResult(); System.out.println(uniqueResult); bt.commit(); session.close(); }
在關鍵字后的括號內填入根據實體對象的那個屬性進行統計查詢,不是根據數據庫表的列名
接收轉化的關鍵字需要注意,使用uniqueresult方法進行接收,Number類進行存放,Number類型的是封裝的接收類,里面封裝了各種數據類型的接收方法,直接使用就OK了。
6. 投影查詢
投影查詢就是查詢一個表中某幾個自己需要的字段數據,這個查詢的好處就是能夠簡明快速的查詢到自己想要的數據,不會浪費內存等資源;
在返回值方面需要注意,返回值是一個list類型的;
@Test /* * 投影查詢 * */ public void demo6() { Session session = HibernateUtils.openSession(); Transaction bt = session.beginTransaction(); String sql1 = "select cust_name from Customer"; String sql2 = "select cust_id,cust_name from Customer";//這種顯示效果不佳,一般不使用 String sql3 = "select new Customer(cust_id,cust_name) from Customer";//需要在對應的Customer實體類中構造方法,創建無參構造 Query cust = session.createQuery(sql3); List list = cust.list(); System.out.println(list); bt.commit(); session.close(); }
查詢單個字段屬性時,直接將表中字段名對應的實體類的屬性名寫上即可,如果是查詢多個而非表中所有時,直接以:
Select new 對象名(屬性名1,屬性名2,…) from 類名;
注意:此中的對象名的對象是需要在實體類名的類中進行構造的,並且要類中有對應的無參構造,以上面的sql3的查詢語句為例,其在Customer類中的對象的構造以及無參構造如下所示:
這個例子中主查詢類是Customer,所以其返回值的范型是Customer,運行的結果如下圖所示:
從中可以看出,數據變成了一條一條的被放在以一個數據集合中;
pass:本章及學習記錄了HQL查詢方式的單表查詢方式,下章才會把學習的HQL的多表查詢方式上傳上來,有需要的可以看看下一章
pass:pass:筆記是根據個人理解寫出來的,有可能有理解不到位的地方,希望各位發現后可以告訴我,相互進步~