1、Query接口java
1.org.hibernate.Query接口定義有執行查詢的方法(該方法完成HQL語句的解析與執行過程,並返回查詢的結果。就像SQL語句沒有jdbc接口,它也就是普通的字符串變量,HQL語句也同樣,編寫好的HQL語句也就是一個普通的字符串變量,而hibernate框架就負責解析HQL語句,而後根據配置信息生成相應的SQL語句來執行數據庫的查詢操做,那麼完成這個過程依靠的就是Query接口);
2.Query接口支持方法鏈編程風格,使得程序代碼更爲簡潔(方法鏈編程:調用方法後,返回的結果依然是調用這個方法的對象,能夠在調用方法後直接調用該對象的其餘方法,這樣可使用一個程序語句完成多個方法的調用與執行。在Query接口中,方法鏈編程使用最多的場景是查詢參數的動態設置,特別是多個參數的設置)
3.Query實例的建立:
a.Session的createQuery()方法建立Query實例
b.createQuery方在調用時須要傳遞一個參數(即要查詢的HQL語句),createQuery(hql)
4.Query執行查詢
a.Query接口的list()方法執行HQL查詢
b.list()方法返回結果數據類型爲java.util.List,List集合中存放符合查詢條件的持久化對象程序員
2、HQL語句sql
HQL語句中能夠直接使用"from 類名"就能夠查詢到此類對應數據庫表中的全部信息.不須要像sql那樣"select*from 表名",直接"form 類名"便可.
list()方法返回的是HQL語句所查詢的類的持久化對象的集合.因此通常定義一個帶泛型的List集合來存儲.
Query query=session.createQuery("from Student");
List<Student> list=query.list();
for(List l:list){
System.out.println(l);
}數據庫
注意:HQL是面向對象的查詢,查詢的是類,不像sql同樣,直接查詢表.所以在from 後面加的是類名(注意大小寫).list()方法會根據查詢的類名而後去映射文件中找到相應的數據庫表,此時便把HQL語句解析成sql語句.再查詢到相應的記錄,最後返回記錄的持久化對象的集合.
對於Hiberante5.2.4,query.list()方法已經棄用:
public void selletTest() {
String hql = "from Seller";
Query query = session.createQuery(hql, Seller.class);
// 注:hibernate5.2.4已經棄用了query.list()方法
List<Seller> sellers = query.getResultList();
for (Seller seller : sellers) {
System.out.println(seller);
}
}編程
*****HQL語句形式*******
select子句:用來指定查詢結果中的對象和屬性,並指定以何種數據類型返回 (在最前面)
from子句:用來指定hql語句的查詢目標,即映射配置的持久化類及其屬性
where子句:邏輯表達式,用來設置查詢條件,限制返回結果和範圍
group by子句:分組查詢語句
having子句:對分組進行限制條件設置
order by子句:用來指定查詢結果中的實例對象的排序
注:From子句在HQL語句中不可或缺的組成部分,一個最簡單的HQL語句形式只要有from就能夠了,其餘的子句均可以省略,這點與SQL語句不一樣數組
**********初學HQL注意的問題***********
一、HQL是面向對象的查詢語言,其查詢主體是持久化類及其屬性,而SQL查詢主體是數據庫表與表的字段;HQL對Java類與屬性大小寫不敏感、SQL語句對大小寫敏感;
二、HQL與SQL在形式上很是類似,特別是HQL在設計上儘可能符合以前SQL開發人員的開發習慣,在使用上很是容易與SQL混淆,可是咱們不能被表象所迷惑,要認清本質;
三、HQL對關鍵字不區分大小寫,好比以前提到的幾個SQL子句其中的關鍵字,from,where,group by,having,order by...等,只要拼寫正確,大小寫並不重要,可是爲了代碼的可讀性與美觀性,習慣上對HQL的全部關鍵字小寫session
3、查詢對象——from子句框架
from子句:
from子句是HQL語句的最簡形式,換句話說,HQL語句只須要from子句就能夠執行查詢了,這是爲何呢?
這是由於from子句指定了HQL語句查詢的主體----映射配置的持久化類及其屬性,當咱們編寫的HQL語句只有from子句的時候,HQL框架默認就是查詢該持久化類的全部實例以及該持久化類映射配置的信息,當HQL框架將HQL解析成SQL時,就會查詢該持久化類映射的數據表中的全部映射字段信息,並將返回的查詢結果封裝成該持久化類的list集合hibernate
hibernate默認的是懶加載狀態,默認狀態下是不查詢外鍵信息所對應的數據的,只有當咱們須要的時候纔會根據具體的須要進行查詢。在控制檯輸出語句中,已經輸出過的外鍵所對應的持久類查詢sql語句再也不重複輸出。設計
from子句中持久化類的引用:
一、不須要引入持久化類的全限定名(如from com.imooc.model.Seller),直接引入類名(from Seller)便可
二、咱們知道在java環境中必定要指明全限定名,這樣java環境才知道去獲取這個類,而HQL語句中之因此能夠省略,是由於auto-import自動引入缺省狀況。hibernate框架中,在解析HQL語句時,會根據映射配置信息自動完成持久化類的導入,這樣的方式更加方便,也更加符合程序員的編程習慣。
三、在from子句中全限定名的引用與直接引入類名是同樣,並不會報錯!
from子句中別名的引用:
1.爲被查詢的類指定別名
2.在HQL語句其餘部分經過別名引用該類
3.別名命名習慣,參考Java變量的命名習慣
爲類指定別名:from Seller as s/from Seller s,要保留代碼的可讀性
4、選擇——select子句
1.以Object[]形式返回選擇的屬性:
2.以List形式返回選擇的屬性
3.以map形式返回選擇的屬性
4.以自定義類型返回選擇的屬性
5.獲取獨特的結果-distinct關鍵字
hql中查詢一個字段 返回的是List<Object>對象,查詢多個字段返回的是List<Object[]>,查詢全部字段返回的是List<實體類>對象,建議多使用別名來區分不一樣表中的相同字段
String hql="select s.name,s.tel,s.address,s.star from Seller s ";
Query query=session.createQuery(hql);
List<Object[]> list=query.list();
for (Object[] objects : list) {
System.out.println(" name : "+objects[0]);
System.out.println(" tel : "+objects[1]);
System.out.println(" address : "+objects[2]);
System.out.println(" star : "+objects[3]);
System.out.println("");
}
選擇-select子句,做用:指定只須要的查詢信息,提升程序的運行效率
1.以Object[]形式返回選擇的屬性:
注意:hql的select查詢語句中,若是指定了多個查詢字段,則返回的是一個Object[]數組,然而若是隻指定了一個查詢字段,則返回的是一個Object對象。
String hql = "select s.name,s.tel from Seller s";
Query query = session.createQuery(hql);
List<Object[]> sellers = query.list();
for(Object[] objs:sellers){
System.out.println("name:"+objs[0]);
System.out.println("tel:"+objs[1]);
}(若是是單個查詢字段的話就只須要把上面的Object[]中的[]去掉,打印輸出時不須要指明下標)
2.以List形式返回選擇的屬性
String hql = "select new list(s.name,s.tel,s.address) from Seller s";
...
List<List>lists=query.getResultList();
3.以map形式返回選擇的屬性
注意:key爲索引值,是字符串類型(map.get("0")),若是給查詢字段指定了別名,則以該別名爲key的值,使用Map集合時考慮使用別名獲取屬性信息
String hql = "select new map(s.name,s.tel,s.address) from Seller s";
4.以自定義類型返回選擇的屬性
(1)持久化類中定義對應的構造器
(2)select子句中調用定義的構造器
注意:默認無參構造器是須要的,由於,在Hibernate沒有指定的查詢的放回集合時候,Hibernate會自動去找默認構造器,若是不存在,則會出現異常
String hql = "select new Seller(s.name,s.tel,s.address) from Seller s";
5.獲取獨特的結果-distinct關鍵字
distinct關鍵字 消除查詢過程當中重複的元素
String hql = "select distinct s.sex from Seller s";
5、限制——where子句
1.比較運算
2.範圍運算
3.字符串模式匹配
4.邏輯運算
5.集合運算
6.在HQL中使用+、-、*、/運算符
7.查詢單個對象(uniqueResult方法)
比較運算符:=、<>、<、>、>=、<=
null值判斷——is [not] null
HQL中的x=null會被解析爲SQL中的x is null、x<>null會被解析爲SQL中的x is not null
範圍運算:
1.[not] in(列表)(列表既能夠明確指出,也能夠是子查詢)
2.[not] between 值1 and 值2
//尋找價格(不)是4000或5000的商品
String hql="from Commodity c where c.price (not) in (5000,4000)";
//尋找價格(不在)在200到4000的商品
String hql1="from Commodity c where c.price (not) between 200 and 4000";
字符串模式匹配:
1.like 關鍵字
2.通配符:% 匹配任意個字符,_ 匹配一個字符
邏輯運算符
1.and(邏輯與)、or(邏輯或)
2.not(邏輯非)
String hql="from Commodity c where c.price between 100 and 4000 and c.category like '%電腦%'";
String hql1="from Commodity c where c.price between 100 and 4000 or c.category like '%電腦%'";
集合運算:
一、is [not] empty,集合【不】爲空,不包含任何元素;對應SQL的exists運算
二、member of 元素屬於集合 ;對應SQL的in運算。
四則運算
1.HQL語句中也可使用+ - * / 四則運算
2.四則運算能夠在where子句和select子句中使用
查詢單個對象:
query接口的uniqueResult方法
1.該方法的返回是實例對象而不是返回集。
2.須要注意的是咱們必需要經過where將查詢獲得的記錄只剩下一條或者查詢不到。若是有一條以上就會發生異常。
6、排序——order by子句
asc升序,desc降序。
多個排序規則用「,」隔開;表示前一個規則中排序條件相同則用後一個排序規則