HQL進階
HQL優化
避免or操作
where
子句包含or
操作,執行時不使用索引
from
House where
street_id
=
'1000' or
street_id
=
'1001'
可以使用in條件來替換
from
House where
street_id
in
('1001','1000')
避免使用not
where
子句包含not
關鍵字,執行時該字段的索引失效
from
House as h where
not (h.price
>1800)
使用比較運算符替換not
from
House as h where
h.price
<=
1800
避免like的特殊形式
查詢時,盡可能少使用
避免having子句
子句中指定條件
避免使用distinct
Hibernate數據檢索策略
Hibernate提供多種數據檢索策略,常用的有:
立即檢索
延遲檢索
不同檢索策略的作用域及默認檢索策略
作用域
類級別
關聯級別 立即檢索/延遲檢索
檢索策略的運行機制
類型
立即檢索
類級別
立即加載檢索方法指定的對象
關聯級別
立即加載與檢索方法指定的對象關聯的對象,可以設定批量檢索數量
優點
對應用程序完全透明,不管對象處于持久化狀態,還是游離狀態,應用程序都可以方便地從一個對象導航到與它關聯的對象缺點
(1)select語句數目多
(2)可能會加載應用程序不需要訪問的對象,造成內存空間的浪費
---------------------------
類型
延遲檢索
類級別
延遲加載檢索方法指定的對象
關聯級別
延遲加載與檢索方法指定的對象關聯的對象,可以設定批量檢索數量
優點
由應用程序決定需要加載那些對象,可以避免執行多余的select語句,以及避免加載應用程序不需要訪問的對象。提高檢索性能,節省內存空間
缺點
應用程序如果希望訪問游離狀態的代理類實例,必須保證它在持久化狀態時已經被初始化
設定檢索策略的常用屬性
屬性
lazy
類級別
1.<class>元素中lazy屬性的可選值為:true(延遲檢索)和false(立即檢索)
2.
<class>元素中lazy屬性的默認值為true
一對多關聯級別
1.<set>元素中lazy屬性的可選值為:true(延遲檢索)、false(立即檢索)和extra(增強延遲檢索)
2.
<set>元素中lazy屬性的默認值為true
多對一關聯級別
1.<many-to-one>元素中的lazy屬性的可選值為:proxy(延遲檢索)、no-proxy(無代理延遲檢索)和false(立即檢索)
2.<many-to-one>元素中的lazy屬性的默認值為true
--------------------------------------------
屬性
fetch
類級別
沒有此屬性
一對多關聯級別
1.<set>元素中fetch屬性的可選值為:select(查詢語句)、subselect(子查詢語句)和join(迫切左外連接檢索)
2.
<set>元素的fetch屬性的默認值為select
多對一關聯級別
1.<many-to-one>元素中fetch屬性的可選值為:select(查詢語句)和join(迫切左外連接檢索)
2.<many-to-one>元素的fetch屬性的默認值為select
HQL 聯接查詢
內聯接:inner
join
最典型、最常用的聯接查詢
兩個表存在主外鍵關系時通常會使用內聯接查詢
join 或
left
outer join
join 或right
outer join
join或
full
outer join
HQL語法
inner
join 或
join
join fetch或
join
fetch
outer join或
left
join
outer join fetch或
left
join
fetch
right
outer join 或
right
join
from
Entity inner
join [fetch]
Entity.property
from
Entity left
join [fetch]
Entity.property
from
Entity right
join [fetch]
Entity.property