一:HQL:Hibernate Query Language
特點:
1. 與SQL語句相似,SQL中的文法基本上都可以直接使用
2. SQL查詢的是表和表中的列;HQL查詢的是對象與對象中的屬性
3. HQL的關鍵字不區分大小寫,類名和屬性名區分大小寫
4. SELECT可以省略
二:HQL查詢 :(盡量使用别名)
(一)簡單的查詢
hql="FROM User";(當hbm.xml檔案中class标簽的auto-import屬性(HQL中寫類的簡單名稱時是否自動導入全限定名)設定為false時,'User'要改寫為全類名)
(二)帶上過濾條件(可以使用别名,可省略as關鍵字):where
hql="FROM User u WHERE u.uid > 10 AND u.uid < 15"; //u.uid可以換成uid,不受别名影響
(三)帶上排序條件:order by
hql="FROM User u WHERE u.uid > 10 ORDER BY u.username DESC, u.uid ASC";
(四)指定select子句(不可以使用select *)
相當于"FROM User"
查詢指定列,傳回的集合的類型是該屬性的類型
查詢多個列,傳回的集合的類型是Object數組(數組中的順序與查詢順序對應)List<Object[ ]>,一般通過Arrays.toString( (Object[ ]) obj )處理之後再列印;針對這種情況,我們可以使用new文法,把查詢出來的部分資料封裝到對象中
中要有指定參數的帶參構造
(五)執行查詢,獲得結果(list、uniqueResult、分頁)
Query query = session.createQuery("FROM User u");
query.setFirstResult(0); 相當于limit index,pageSize中的index
query.setMaxResult(10); 相當于limit index,pageSize中的pageSize
List list = query.list(); 擷取清單
query.uniqueResult(); 查詢的是唯一的結果(當結果不唯一時,會抛異常)
(六)方法鍊
List list = session.createQuery("FROM User u").setFirstResult(0).setMaxResult(10).list();n
List list = session.createQuery(//
"FROM User u")//
.setFirstResult(0)//
.setMaxResult(10)//
.list();
//----------------------- 進階
(七)聚集函數
hql="SELECT COUNT(*) FROM User u"; count傳回Long型資料
(八)分組 group by ... having ... (select之後一般寫的是group by之後的内容或者聚集函數)
hql="SELECT u.username,COUNT(u.uid)" +
"FROM User u WHERE u.uid < 9" +
"GROUP BY u.username" +
"HAVING COUNT(u.uid) > 2" +
"ORDER BY COUNT(u.uid) DESC";
或使用别名:(在having中不能使用列别名,order by中可以使用列别名)
hql="SELECT u.username,COUNT(u.uid) AS c " +
"FROM User u WHERE u.uid < 9 " +
"GROUP BY u.username " +
"HAVING COUNT(u.uid) > 2 " +
"ORDER BY c DESC";
(九)連接配接查詢 / HQL是面向對象的查詢
>>内連接配接(inner關鍵字可以省略)
hql="SELECT u.uid,s.sname FROM User u INNER JOIN u.skill s"; 直接把使用者名和技能一起查詢出來
>>左外連接配接(outer關鍵字可以省略)
hql="SELECT u.uid,s.sname FROM User u LEFT OUTER JOIN u.skill s";
>>右外連接配接(outer關鍵字可以省略)
hql="SELECT u.uid,s.sname FROM User u RIGHT OUTER JOIN u.skill s";
>>超級連接配接
hql="SELECT u.uid,u.skill.sname FROM User u";
(十)查詢時使用參數
>>方式一:使用"?"占位符(除了JDBC中,所有占位符的索引值都是從0開始)
hql="FROM User u WHERE u.uid BETWEEN ? AND ?";(between...and...包含邊界值)
List list = session.createQuery()
.setParameter(0,5) //将第一個占位符的值設定位5
.setParameter(1,10) //将第二個占位符的值設定位10
.list();
>>方式二:使用變量名(格式: “:變量名”)
hql="FROM User u WHERE u.uid BETWEEN :uidMin AND :uidMax";
List list = session.createQuery()
.setParameter("uidMin",5) //将第一個變量名的值設定位5
.setParameter("uidMax",10) //将第二個變量名符的值設定位10
.list();
當參數是集合時:(隻能用變量名的方式結合setParameterList方法 )
hql="FROM User u WHERE u.uid IN (:uids)";
List list = session.createQuery()
.setParameterList("uids",new Object[ ] { 1,2,3 })
.list();
(十一)使用命名查詢(queryByRange是在hbm.xml檔案中定義的查詢名)
List list = session.getNamedQuery("queryByRange")
将第一個占位符的值設定位5
将第二個占位符的值設定位10
.list();
或:
List list = session.getNamedQuery("queryByRange")
将第一個變量名的值設定位5
将第二個變量名的值設定位10
.list();
(十二)update和delete,不會通知session緩存(是以修改之後不會通知session緩存,隻有通過refresh(obj)方法才能更新session中的對象為最新對象)
在update或delete之後需要refresh(obj)一下來擷取最新的狀态
int i = session.createQuery("UPDATE User u SET u.username=? WHERE u.uid>5")
.setParameter(0,"newName")
傳回int類型的結果,表示影響的行數
int i = session.createQuery("DELETE User u WHERE u.uid>5")
.setParameter(0,"newName")