HQL:實用技術

HQL:實用技術

一:使用HQL語句

  1. Hibernate支持三種查詢方式:
    (1.)HQL查詢,Criteriac查詢及原生SQL(Native SQL)查詢。HQL(Hibernate Query Language,Hibernate查詢語言)是一種面向對象的查詢語言,其中沒有表和字段的概念,只有類對象,屬性的概念。

二:編寫HQL語句

  1. From子句
    Select子句
    Where子句
    使用表達式
    Order by 子句: 示例:升序排序:from Emp order by hireDate salary desc;
  2. 執行HQL語句的步驟:
    獲取Session 對象
    編寫HQL語句
    建立Query對象:Query query =session.oreateQuery(?); 執行查詢,獲得查詢結果

三:在SQL語句中綁定參數

  1. 按位置綁定參數
    Query query=session.createQuery(「from Emp where job=? And salary>?」);
  2. 按參數名綁定
    Query query=session.createQuery(「from Emp where job=:empJob and salary>:empSalary」);
  3. 綁定各類類型的參數: Query接口提供
    (1.)setBoolean();
    (2.)setByte();
    (3.)setDouble();
    (4.)setDate();
    (5.)setString();
    (6.)setParameter();用來綁定任意類型。
    (7.)setProperties();用來綁定參數與一個對象的屬性值。
    4.使用uniqueResult()方法獲取惟一結果

四:分頁和投影

  1. 實現數據分頁查詢
    經過Query接口的setFirstResult(int firstResult)方法和setMaxResults(int maxResults)方法實現。 分別返回最大和最小記錄。
  2. 使用投影查詢
    *每條查詢結果僅包含一個結果列:
    Public List<String>findAllNames(){ String hql=」select deptName from Dept」; Return currentSession().createQuery(?).list();//省略其它內容 }

*查詢每條結果包含不止一個結果列:
Public List<String>findAllNames(){ String hql=」select deptNo,deptName from Dept」; Return currentSession().createQuery(?).list();//省略其它內容 }數據庫

*將每條查詢結果經過構造方法封裝成對象
Public class DeptDao extends BaseDao{ //要求Dept類中有Dept(Byte deptNo,String deptName)和Dept()構造方法 Public List<Dept> findAllDeptList(){ String hql=」select new Dept(deptNo,deptName)from Dept」; Return currentSession().createQuery(?).list();//省略其它內容 } }緩存

HQL鏈接查詢和註解

一:HQL鏈接查詢

各類鏈接查詢:
內鏈接:inner join或join性能優化

From Entity inner [inner] join [fetch] Entity.property;session

左外鏈接:left outer join或left joinapp

From Entity left[outer] join [fetch] Entity.property;函數

迫切左外鏈接:left outer join fetch或left join fetch性能

右外鏈接:right outer join或right joinfetch

迫切鏈接:inner join fetch或join fetch優化

注:迫切鏈接要使用對象鏈接,否則的話會出錯。.net

等值鏈接:

     From  Dept d,Emp p where d=e.dept;

聚合函數 select count(*),sum(sal),min(sal),max(sal),avg(sal)from Emp;

List<Object[]>list=query.list();

for (Object[] o:list) {

System.out.println("總:"+o[0]+"和:"+o[1]+"最小值:"+o[2]+"最大值:"+o[3]+"平均數:"+o[4]);

}//省略其它代碼

按職位統計員工個數:

select e.job,count(*) from Emp e group by e.job

統計每一個部門下的員工個數而且大於2的顯示輸出:

select e.job,count() from Emp e group by e.job having count()>2;

子查詢關鍵字: all:子查詢返回全部記錄。

any:子查詢返回的任意的一條記錄。

some:與「any」意思相同

in:與「=any意思相同」

exists:子查詢語句至少返回一條記錄。

操做集合函數或屬性。 size()或size:獲取集合中的元素數目。

minIndex()或minIndex:對於創建索引的集合,獲取最小的索引

maxIndex()或maxIndex:對於創建索引的集合,獲取最大的索引。

minElement()或minElement:對於包含基本類型的元素集合,得到集合中取值最小的元素。

maxElement()或maxElement: 對於包含基本類型的元素集合,得到集合中取值最大的元素。

Elements();獲取集合中的全部元素。

二:查詢性能優化

hibernate查詢優化策略:
(1.)使用迫切左外鏈接,或迫切鏈接查詢策略,配置二級緩存和查詢等方式,減小select語句數目,下降訪問數據庫的頻率。

(2.)使用延遲加載等方式避免加載多餘不須要訪問的數據。

(3.)使用Query接口的iterate()方法減小select語句的字段,下降訪問數據庫的數據量,並結合緩存等機制減小數據庫的訪問次數,提升查詢效率。

2.HQL優化:

(1.)避免使用or操做的不當。

(2.)避免使用not。

(3.)避免使用like的特殊形式。

(4.)避免使用having子句。

(5.)避免使用distinct。

(6.)索引在如下狀況下失效,使用時注意。

對字段使用函數,該字段的索引將不起做用。如:substring(aa,1,2)=’xxx’

               對字段進行計算,該字段的索引將不起做用。如:price+10。

三:註解

使用hibernate註解的步驟以下:
(1.)使用註解配置持久化類及對象的關聯關係。

(2.)在hibernate配置文件(hibernate.cfg.xml)中聲明持久化類,語法以下:

<mapping class=」持久化類完整限定名」>

配置持久化類的經常使用註解: @Entity:將一個類聲明爲持久化類。

@Table:爲持久化映射指定表。

@Id:聲明瞭持久化類的表示屬性。

@GeneratedValue:定義表示屬性的生成策略。

@UniqueConstraint:定義表的惟一約束。

@Lob:表示屬性將被持久化爲BLOD或者CLOD類型。

@Column:將屬性映射到數據庫字段。

@Transient:指定能夠忽略的屬性,不用持久化到數據庫。

相關文章
相關標籤/搜索