HQL連接查詢和注解
一:HQL連接查詢
- 各種連接查詢:
內連接:inner join或join
From Entity inner [inner] join [fetch] Entity.property;
左外連接:left outer join或left join
From Entity left[outer] join [fetch] Entity.property;
迫切左外連接:left outer join fetch或left join fetch
右外連接:right outer join或right join
迫切連接:inner join fetch或join fetch
注:迫切連接要使用對象連接,不然的話會出錯。
等值連接:
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:指定可以忽略的屬性,不用持久化到數據庫。
