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需要四步:
得到Session
編寫HQL語句
創建Query對象
Query接口是HQL 查詢接口。它提供了各種的查詢功能
執行查詢,得到結果
設置別名(alias)
from Street as s 或 from street s
s 是Street 的別名,通過as 關鍵字指定,關鍵字as
是可選的
//
省略部分代碼
try
{
sessionFactory
=
new
Configuration().configure().buildSessionFactory();
session
= sessionFactory.openSession();
String hql
=
“from
Street”;
Query
query
=
session.createQuery(hql);
List<Street>
list = query.list();
for(Street street:list){
System.out.println("街道名稱
"
+
street.getDistrict().getName()+"區"
+street.getName());
}
}
catch (HibernateException
e)
{
e.printStackTrace();
}
finally{
// 省略部分代碼
}
where
子句指定限定條件
通過與SQL
相同的比較操作符指定條件
如:
==、<>、<、>、>=、<=
between、not
between
in、not
in
is、like
通過and、or
等邏輯連接符組合各個邏輯表達式
//省略代碼
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()){
System.out.println("id
的類型為
:"+
it.next().getClass());
}
參數綁定
"?"占位符
使用“?”作占位符,可以先設定查詢參數
通過setType()方法設置指定的參數
必須保證每個占位符都設置了參數值
必須依照“?”所設定順序設定
下標從0開始,而不是使用PreparedStatement
對象時的從1開始
//省略代碼
String
hql
="select
u.password
from
User as u where u.name = ?";
Query
query
=
session.createQuery(hql);
query.setString(0,
"admin");
//省略代碼
命名參數
:name
即命名參數
標識了一個名為“name”的查詢參數
根據此參數名進行參數值設定
不需要依照特定的順序
//省略代碼
String
hql
="select
u.password
from
User as u where u.name= :name";
Query
query
=
session.createQuery(hql);
query.setString("name",
"admin");
//省略代碼
封裝參數
動態設置查詢參數
將參數封裝為一個bean
通過Query
對象的setProperties(Object
bean)實現參數的設定
public
class QueryProperties
{
private
String title;
//標題
private
Double high_price;
//價格最高值
private
Double low_price;
//價格最低值
private
String type_id;
//房屋類型編號
private
String street_id;
//街道編號
private
Integer small_floorage;
//面積最小值
private
Integer big_floorage; //面積最大值
//省略setter
和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();
//
省略部分代碼
HQL
常用聚合函數
count(
):統計函數
select
count(house)
from House h where h.user_id
=
'1010'
max(
)和min(
):最大值和最小值函數
select
max(h.price),min(h.price)
from House h
avg(
)和sum(
):平均值和求和函數
select
avg(h.price),sum(h.floorage)
from House h where h.user_id=
'1000'
與SQL類似,HQL
通過order
by 子句實現對查詢結果的排序
默認情況下按升序順序排序
排序策略(asc
升序、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對象提供了簡便的分頁方法
setFirstResult(int
firstResult)方法
設置第一條記錄的位置
setMaxResults(int
maxResults)方法
設置最大返回的記錄條數
//
省略部分代碼
query.setFirstResult((pageIndex-1)*pageSize);
query.setMaxResults(pageSize);
List
result=query.list();
總結
Hibernate主要提供哪兩種數據查詢方式?
為什么使用HQL?
HQL查詢參數綁定有幾種方式?
HQL常用的聚合函數有哪些?
Hibernate如何實現分頁?
備注:
HQL屬性優先查詢(如果是不寫u.*)
優先級:屬性-->字段
select u.name from User u
select name from User u
"?"占位符,使用query.setXXX() 或
setParameter()方法都可以填充