NHibernte教程 10 關聯查詢

2022-06-06 14:33:05 字數 2908 閱讀 7434

本節內容

結語在nhibernate中提供了三種查詢方式給我們選擇:nhibernate查詢語言(hql,nhibernate query  language)、條件查詢(criteria api,query by example(qbe)是criteria  api的一種特殊情況)、原生sql(literal sql,t-sql、pl/sql)。這一節分別使用這三種方式來關聯查詢。

在關係模型中:可以使用子表作為內連線查詢customer,像這樣:

select * from customer c inner join order o on c.customerid=o.customerid  where o.customerid=

使用父表作為內連線查詢order,像這樣:

select * from oder o inner join customer c on o.customerid=c.customerid where  o.orderid=

下面我們來看看在nhibernate中使用原生sql查詢。這篇來完成查詢訂單在orderdata之後的顧客列表不同查詢的寫法。

public ilist usesql_getcustomerswithorders(datetime orderdate)

from customer "+

" inner join [order] o on o.customer=.customerid where o.orderdate> :orderdate")

.addentity("customer", typeof(customer))

.setdatetime("orderdate", orderdate)

.list();

}

具體情況是:例項化iquery介面;使用isession.createsqlquery()方法,傳遞的引數是sql查詢語句;標記是customer所有屬性的簡寫。  使用addentity查詢返回的持久化類,setdatatime設定引數,根據不同型別,方法名不同。

查詢訂單在orderdata之後的顧客列表的hql關聯查詢寫法:

public ilist usehql_getcustomerswithorders(datetime orderdate)

這裡使用基於物件導向的hql,一目了然,符合物件導向程式設計習慣。

寫個測試用例測試usehql_getcustomerswithorderstest()查詢方法是否正確:

[test]

public void usehql_getcustomerswithorderstest()

}foreach (customer c in customers)

}

首先呼叫usehql_getcustomerswithorders()方法查詢訂單在2023年10月1號之後的顧客列表,遍歷顧客列表,斷言顧客為預期的1個,他的訂單時間在2023年10月1號之後。ok!測試成功。注意:這個測試用例可測試本篇所有的關聯查詢。

我們使用createcriteria()在關聯之間導航,很容易地在實體之間指定約束。這裡第二個createcriteria()返回乙個icriteria的新例項,並指向orders實體的元素。在查詢中子物件使用子createcriteria語句,這是因為實體之間的關聯我們在對映檔案中已經定義好了。還有一種方法使用createalias()不會建立icriteria的新例項。

這個例子返回顧客列表有重複的,不是我們想要的結果。

public ilist usecriteriaapi_getcustomerswithorders(datetime orderdate)

預過濾使用icriteria介面的setresulttransformer(iresulttransformer resulttransformer)方法返回滿足特定條件的customer。上面例子中使用條件查詢,觀察其生成的sql語句並沒有distinct,這時可以使用nhibernate.transform命名空間中的方法或者使用nhibernate提供的nhibernate.criteriautil.rootentity、nhibernate.criteriautil.distinctrootentity、nhibernate.criteriautil.aliastoentitymap靜態方法實現預過濾的作用。那麼上面的查詢應該修改為:

public ilist usecriteriaapi_getcustomerswithorders(datetime orderdate)

這個例子從轉換結果集的角度實現了我們想要的效果。

投影

呼叫setprojection()方法可以實現應用投影到乙個查詢中。nhibernate.criterion.projections是projection的例項工廠,projections提供了非常多的方法,看看下面的截圖,下拉列表中的方法是不是很多啊:

現在可以條件查詢提供的投影來完成上面同樣的目的:

public ilist usecriteriaapi_getdistinctcustomers(datetime orderdate)

我們可以新增若干的投影到投影列表中,例如這個例子我新增乙個customerid屬性值到投影列表中,這個列表中的所有屬性值都設定了distinct投影,第一句返回訂單時間在orderdate之後所有顧客distinct的customerid,第二句根據返回的customerid查詢顧客列表。達到上面的目的。這時發現其生成的sql語句中有distinct。我們使用投影可以很容易的組合我們需要的各種方法。

Pycharm關聯Anaconda教程

下面來看下如何建立我們自己的專案,和關聯anaconda pycharm安裝與永久啟用教程 anaconda安裝詳細教程 首先,開啟pycharm,點選file,settings 開啟settings,點選project,看圖點選,然後點選show all 會彈出下面的框,點選 新增環境 選擇con...

第10章 關聯容器

關聯容器支援通過鍵來高效地查詢和讀取元素。基本關聯容器 map和set。set僅包含乙個鍵。multimap和multiset支援同乙個鍵多次出現在容器中。pair型別,定義在utility標頭檔案中。建立和初始化如 pairp1 v1,v2 或make pair v1,v2 賦給pair型別的變數...

第10章 關聯容器 1

關聯容器和順序容器的本質差別在於 關聯容器通過鍵 key 儲存和讀取元素,而順序容器則通過元素在容器中的位置順序儲存和訪問元素。關聯容器 associative container 支援通過鍵來高效地查詢和讀取元素。map的元素以鍵 值 key value 對的形式組織 鍵用作元素在map中的索引,...