Hibernate的檢索方式(三)

2021-06-04 13:56:24 字數 3956 閱讀 4514

三、連線查詢

hql和qbc支援的各種連線型別

在程式中指定的鏈結查詢型別

hql語法

qbc語法

使用範圍

內連線inner join 或者join

criteria.createalias()

適用於有關聯的持久化類,並且在對映檔案中對這種關聯關係作了對映。

迫切內連線

inner join fetch 或者join fetch

不支援隱式內連線

不支援左外連線

left outer join 或者left join

不支援迫切左外連線

left outer join fetch 或者left join fetch

fetchmode.eager

右外連線

right outer join 或者right join

不支援交叉連線

classa,classb

不支援適用於不存在關聯關係的持久化類

1、預設情況下關聯級別的執行時檢索策略

採用配置檔案中設定的檢索策略,但有乙個例外,那就是hql會忽略對映檔案設定的迫切左外連線策略,改用立即檢索。

2、迫切左外連線

顯式指定物件的關聯關係為迫切左外連線檢索策略,可以覆蓋對映檔案中指定的檢索策略。

例hql

"from customer c left join fetch c.orders o where c.name like 't%'"

+" o.name like 't%'"

例qbc

list reslut=session.createcriteria(customer.class)    .setfetchmode("orders",fetchmode.eager)    .add(expression.like("name","t",matchmode.start))

.list();

當使用迫切左外連線檢索策略時,查詢結果中可能會包含重複元素,可以通過乙個hashset來過濾重複元素:list result=….list();  hashset set=new hashset(result);

hibernate允許在一條查詢語句中迫切左外連線多個多對一或一對一關聯的類。

list reslut=session.createcriteria(a.class)     .setfetchmode("this.b",fetchmode.eager)     .setfetchmode("this.c",fetchmode.eager)     .add(expression.isnotnull("this.b"))     .add(expression.isnotnull("this.c"))

.list();

當存在傳遞關聯時,可以通過hql來同時迫切左外連線關聯類和依賴關聯類,但qbc無法表達這種形式的迫切左外連線。

3、左外連線

使用左外連線查詢時,將根據對映檔案的配置來決定關聯的檢索策略。

4、內連線

qbc也支援內連線查詢

list reslut=session.createcriteria(customer.class)     .add(expression.like("name","t",matchmode.srart))     .createcriteria("orders")     .add(expression.like("ordernumber","t",matchmode.srart))

.list();

預設情況下,qbc只檢索出customer物件,以上**等同於以下hql查詢語句:

"select c from customer c join  c.orders o where c.name like 't%'"

+ " and o.ordernumber like 't%'";

createalias()方法為關聯屬性(集合)賦予別名。如果希望qbc返回的集合也包含成對的customer和order物件,可以呼叫returnmaps()方法:

list reslut=session.createcriteria(customer.class)     .createalias("orders","o")     .add(expression.like("this.name","t",matchmode.srart))     .add(expression.like("o.ordernumber","t",matchmode.srart))     .returnmaps()

.list();

採用內連線查詢時,hql與qbc有不同的預設行為,前者檢索成對的物件,後者僅檢索出要檢索的單個物件(不包含關聯的物件)。

5、迫切內連線

顯式指定物件的關聯關係為迫切內連線檢索策略,可以覆蓋對映檔案中指定的檢索策略。

6、隱式內連線

一對一"from cunstomer c where c.homeaddress.provice like '%hai%'"

list reslut=session.createcriteria(customer.class)     .add(expression.like("homeaddress.provice","t",matchmode.srart))

.list();

多對一"from order o where o.customer.name like '%hai%'"

qbc 不支援隱式內連線,下邊是不正確的,:

list reslut=session.createcriteria(order.class)     .add(expression.like("customer.name","t",matchmode.srart))

.list();

對於qbc,必須顯式指定內連線查詢:

list reslut=session.createcriteria(order.class)     .createalias("customer","c").add(expression.like("c.name","t",matchmode.srart))

.list();

一對多或多對多

隱式內連線不適用。

7、右外連線

8、使用sql風格的交叉連線和隱式內連線

hql支援sql風格的交叉連線查詢。如:from customer c, order o

在sql語言中,顯式內連線查詢的語句使用inner join關鍵字,並且用on字句設定連線條件,形式為:

"select * from customer c inner join order o on c.id=o.customer_id"

隱式內連線查詢語句不包含關鍵字阿,並且用where字句設定連線條件:

"select * from customer c ,order o where c.id=o.customer_id"

9、關聯級別執行是的檢索策略

(1)沒有顯式指定,使用配置檔案的,但有乙個例外,那就是hql會忽略對映檔案設定的迫切左外連線策略,改用立即檢索。

(2)如果顯式指定,就會覆蓋對映檔案配置的檢索策略。在hql查詢語句中顯式指定檢索策略包括以下內容。

l         left join fetch

l         inner join fetch

qbc通過fetchmode類來顯式指定檢索策略,有以下3個靜態例項。

l         fetchmode.default:預設,採用配置;

l         fetchmode.eager:覆蓋,指定迫切左外連線檢索策略;

l         fetchmode.lazy:覆蓋對映配置檔案的檢索策略,在程式中指定延遲檢索策略。

待續!

Hibernate的檢索方式(三)

三 連線查詢 hql和qbc支援的各種連線型別 在程式中指定的鏈結查詢型別 hql語法 qbc語法 使用範圍 內連線inner join 或者join criteria.createalias 適用於有關聯的持久化類,並且在對映檔案中對這種關聯關係作了對映。迫切內連線 inner join fetc...

Hibernate檢索方式

hibernate 的檢索方式有5種。customer c session.get customer.class,2 c.getorders size 可以根據已經載入的物件導航到其他物件,如一對多的查詢。session.get customer.class,3 session.load order...

Hibernate 檢索方式

hibernate常見檢索方式有以下幾種 1 導航物件圖檢索方式 根據已經載入的物件導航到其他物件。例如對於已經載入的customer物件,呼叫customer.getorders iterator 方法,則得到所有與之關聯的order物件。2 oid檢索方式 此方式是按照物件的oid來檢索物件。常...