HQL實用技術
Hibernate
支持兩種主要的查詢方式
HQL(Hibernate Query Languge,Hibernate
查詢語言)查詢
是一種面向對象的查詢語言,其中沒有表和字段的概念,只有類、對象和屬性的概念
HQL 是應用較為廣泛的方式
Criteria
查詢
又稱為“對象查詢”,它用面向對象的方式將構造查詢的過程做了封裝
使用HQL 可以避免使用JDBC
查詢的一些弊端
不需要再編寫繁復的SQL 語句,針對實體類及其屬性進行查詢
查詢結果是直接存放在List
中的對象,不需要再次封裝
獨立于數據庫,對不同的數據庫根據Hibernate dialect 屬性的配置自動生成不同的SQL
語句執行
語法:
[select/update/delete……]
from
Entity [where……]
[group by……] [having……] [order by……]
使用HQL需要四步:
創建Query對象
執行查詢,得到結果
設置別名(alias)
s 是Street 的別名,通過as 關鍵字指定,關鍵字as
是可選的
//
省略部分代碼
try
{
=
Configuration().configure().
=
String
=
“from
Street”;
query
=
session.createQuery(hql);
list = query.list();
for(Street
System.out.println("街道名稱
"
+
street.getDistrict().getName()+"區"
+street.getName());
}
}
catch (HibernateException
e)
{
}
finally{
//
}
子句指定限定條件
相同的比較操作符指定條件
between
in
等邏輯連接符組合各個邏輯表達式
//省略代碼
String
hql
="from
Street as s where
s.name='中關村大街'";
Query
query
=
session.createQuery(hql);
List
userList
=
query.list();
//省略代碼
String
hql
="select
u.password
from
User as u where u.name='admin'";
String
hql
="select
u.id,u.password
from
User as u where u.name='admin'";
//省略代碼
String
hql
="select
u.id from User
as u
where
user.name='admin'";
Query
query
=
session.createQuery(hql);
List
list
=
query.list();
Iterator
it
= list.iterator();
if(it.hasNext()){
的類型為
:"+
it.next().getClass());
}
參數綁定
對象時的從1開始
//省略代碼
String
hql
="select
u.password
from
User as u where u.name = ?";
Query
query
=
session.createQuery(hql);
query.setString(0,
"admin");
//省略代碼
即命名參數
//省略代碼
String
hql
="select
u.password
from
User as u where u.name= :name";
Query
query
=
session.createQuery(hql);
query.setString("name",
"admin");
//省略代碼
對象的setProperties(Object
bean)實現參數的設定
public
class QueryProperties
{
String title;
//
Double high_price;
//
Double low_price;
//
String type_id;
//
String street_id;
//
Integer small_floorage;
//面積最小值
Integer big_floorage;
和getter
方法
}
StringBuffer
queryString
=
new StringBuffer();
queryString.append("from
House where ");
queryString.append("(title
like :title) ");
queryString.append("and
(street_id
like
:street_id)
");
queryString.append("and
(type_id
like
:type_id)
");
queryString.append("and
(price between :low_price
and
:high_price)
");
queryString.append("and(floorage
between :small_floorage
and
:big_floorage)
");
//
省略部分代碼
Query
query
=
session.createQuery(queryString.toString());
query.setProperties(qp);
List<House>
list = query.list();
//
省略部分代碼
常用聚合函數
):統計函數
select
count(house)
from House h where h.user_id
=
'1010'
)和min(
):最大值和最小值函數
select
max(h.price),min(h.price)
from House h
)和sum(
):平均值和求和函數
select
avg(h.price),sum(h.floorage)
from House h where h.user_id=
'1000'
通過order
by 子句實現對查詢結果的排序
升序、desc
降序)
from
House house
order
by house.price
from
House house
order
by house.price
desc
from
House house
order
by house.price
,
house.floorage
分組
通過group
by 子句實現
并使用having
子句對group
by 返回的結果集進行篩選
select
sum(house.floorage)
from House house
group
by house.street_id
having
sum(house.floorage)
> 1000
分頁
Query對象提供了簡便的分頁方法
firstResult)方法
設置第一條記錄的位置
maxResults)方法
設置最大返回的記錄條數
//
省略部分代碼
query.setFirstResult((pageIndex-1)*pageSize);
query.setMaxResults(pageSize);
List
result=query.list();
總結
Hibernate主要提供哪兩種數據查詢方式?
為什么使用HQL?
HQL查詢參數綁定有幾種方式?
HQL常用的聚合函數有哪些?
Hibernate如何實現分頁?
備注:
HQL屬性優先查詢(如果是不寫u.*)
優先級:屬性-->字段
select
select name from User u
"?"占位符,使用query.setXXX() 或
setParameter()方法都可以填充