HQL查詢

一、HQL語言
HQL語句與SQL語句相似,其基本的使用習慣也與SQL相同。由於HQL是面向對象的查詢語句,所以它需要從目標對象中查詢信息並返回匹配單個實體對象或多個實體對象的集合,而SQL語句是從數據庫的表中查找指定信息,返回的是單條信息或多個信息的集合。
HQL語句區分大小寫的
HQL的基本語法:
select "對象.屬性名"
from "對象"
where "過濾條件"
group by "對象.屬性名" having "分組條件"
order by "對象名.屬性名"
實際應用中,
select * from People p where p.id='1'
等價於
from People p where p.id='1'
該HQL語句是查詢過濾從數據庫信息返回的實體對象的集合,其過濾的條件爲對象屬性"id"爲1,其中People爲實體對象
二、實體對象查詢
在HQL語句中,可以通過from子句對實體對象進行直接查詢:
from People
在大多數情況下,最好爲查詢的實體對象指定一個別名,以方便在查詢語句的其它地方引用實體對象,別名的命名方法如下:
from People p
別名的首字母最好小寫,這是HQL語句的規範寫法,與Java中變量的命名規範是一致的,以避免與語句中的實體對象混淆。
上面的HQL語句將查詢數據庫的實體對象People所對應的所有數據,並以封裝好的People對象的集合的形式返回。但是上面的語句有個侷限性,它會查詢實體對象People映射的所有數據庫字段,相當於SQL語句的"SELECT *"。那麼,HQL如何獲取指定的字段信息?在HQL中需要通過動態實例化查詢來實現這個功能,示例如下:
select new People(id,name) from People p

此種查詢方式通過"new"關鍵字對實體對象動態實例化,將指定的實體對象屬性進行重新封裝,既不失去數據的封裝性,又可以提高查詢的效率。
在上面的語句中,最好不要使用下面的語句進行查詢:

select p.id,p.name from People p

因爲此語句返回的不是原有的對象實體狀態,而是一個object類型的數據,它破壞了數據原有的封裝性。
三、條件對象查詢
例如:

from People p where p.sex="男"

四、HQL參數綁定機制:
參數綁定機制可以使查詢語句和參數具體值相互獨立,不但能提高程序的開發效率,還可以有效的防止SQL的注入攻擊。
1.利用順序佔位符"?"替代具體參數在HQL語句中可以通過順序佔位符"?"替代具體的參數值,利用Query對象的setParameter()方法對其進行賦值,此種操作方式與JDBC中的PreparedStatement對象的參數綁定方式相似。
例如:

Session session=HibernateInitialize.getsession();
List peopleList=new ArrayList();
String hql="from People p where p.sex=?";
Query query=session.createQuery(hql);
query.setParameter(0,"男");
peopleList=query.list();

2.利用引用佔位符":parameter"替代具體的參數
HQL語句除了支持順序佔位符"?"以爲,還支持引用佔位符":parameter",引用佔位符是":"號與自定義參數名的組合。
例如:

Session session=HibernateInitialize.getsession();
List peopleList=new ArrayList();
String hql="from People p where p.sex=:sex";
Query query=session.createQuery(hql);
query.setParameter("sex","男");
peopleList=query.list();

五、排序查詢
在SQL中,通過order by 子句和asc、desc關鍵字實現查詢結果集的排序操作,asc是正序排列,desc是降序排列。HQL查詢中同樣提供了此功能,只是排序的條件參數換成了實體對象的屬性
按年齡的倒序排列:

from People p order by p.age desc

按照id的正序排列:

from People p order by p.id asc

六、聚合函數
HQL查詢語句支持SQL中常用的聚合函數,如sum 、avg、count、max、min等,其使用方法與SQL中基本相同。
如:

select avg(p.age) from People p 

用於計算所有人的平均年齡
又如:

select max(p.age) from People p

用於查詢所有人中的年齡最大的這個人的信息
七、分組查詢
在HQL查詢語言中,使用group by子句進行分組操作,其使用與SQL語句相同。在HQL中,同樣可以使用group by子句使用having子句,不過這需要底層數據庫的支持。
如:

select p.sex,count(*) from People p group by p.sex

注意,HQL分組查詢語句中的分組條件,也就是group by子句後的參數必須包含在查詢的結果中。
由於分組查詢破壞了實體對象的原來的狀態,所以結果集返回的是對象數組。
八、子查詢
HQL支持子查詢,不過需要底層數據庫的支持。HQL中的一個子查詢必須被圓括號()包起來

from People p where p.age>(select avg(age) from People)

九、聯合查詢
HQL支持SQL中的內連接(inner join)、左外連接查詢(left outer join)、右外連接查詢(right outer join)和全連接查詢(full join)
如,在班級表和學生表中一對一映射關係,可以通過HQL的左連接方式獲取關聯信息
如:

select s.number,s.name,s.age,s.sex,c.id from Student s left join Class c
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章