本節內容
nhibernate中的查詢方法
nhibernate查詢語言(hql)
1.from子句
2.select子句
3.where子句
4.order by子句
5.group by子句
例項分析
結語nhibernate中的查詢方法
在nhibernate中提供了三種查詢方式給我們選擇:nhibernate查詢語言(hql,nhibernate query language)、條件查詢(criteria api,query by example(qbe)是criteria api的一種特殊情況)、原生sql(literal sql,t-sql、pl/sql)。每個人有不同的喜好和特長,可以根據自己的情況選擇使用其中的一種或幾種。這一節我們介紹nhibernate查詢語言(hql,nhibernate query language)。
nhibernate查詢語言(hql)
顧名思義,同sql語句類似:
1.簡單用法:返回表中所有資料。
public ilistfrom()
2.使用別名:使用as來賦予表的別名,as可以省略。
public ilistfromalias()
3.笛卡爾積:出現多個類,或者分別使用別名,返回笛卡爾積或者稱為「交叉」連線。
2.select子句
1.簡單用法:在結果集中返回指定的物件和屬性。
public ilistselect()
2.陣列:用object的陣列返回多個物件和/或多個屬性,或者使用特殊的elements功能,注意一般要結合group by使用。
public ilistselectobject()
或者使用型別安全的.net物件,以後在例項中說明。
3.統計函式:用object的陣列返回屬性的統計函式的結果,注意統計函式的變數也可以是集合count( elements(c.customerid) )
public ilistaggregatefunction()
4.distinct用法:distinct和all關鍵字的用法和語義與sql相同。例項:獲取不同customer的firstname。
public ilistdistinct()
3.where子句
where子句讓你縮小你要返回的例項的列表範圍。
public ilistwhere()
where子句允許出現的表示式包括了在sql中的大多數情況:
數學操作符:+, -, *, /
真假比較操作符:=, >=, <=, <>, !=, like
邏輯操作符:and, or, not
字串連線操作符:||
sql標量函式:upper(),lower()
沒有字首的( ):表示分組
in, between, is null
位置引數:?
命名引數::name, :start_date, :x1
sql文字:'foo', 69, '1970-01-01 10:00:01.0'
列舉值或常量:color.tabby
4.order by子句
按照任何返回的類或者元件的屬性排序:asc公升序、desc降序。
public ilistorderby()
5.group by子句
按照任何返回的類或者元件的屬性進行分組。
public ilistgroupby()
例項分析
public ilistgetcustomersbyfirstname(string firstname)
書寫hql引數有四種寫法:
寫法1:可能會引起sql注入,不要使用。
寫法2:ado.net風格的?引數,nhibernate的引數從0開始計數。
寫法3:命名引數用:name的形式在查詢字串中表示,這時iquery介面把實際引數繫結到命名引數。
寫法4:命名的引數列表,把一些引數新增到乙個集合列表中的形式,比如可以查詢資料是否在這個集合列表中。
使用命名引數有一些好處:命名引數不依賴於它們在查詢字串**現的順序;在同乙個查詢中可以使用多次;它們的可讀性好。所以在書寫hql使用引數的時候推薦命名型引數形式。
測試一下這個方法吧:看看資料庫中firstname為「yjinglee」的記錄個數是否是1條,並可以判斷查詢出來的資料的firstname屬性是不是「yjinglee」。
[test]
public void getcustomerbyfirstnametest()
}
例項2:獲取顧客id大於customerid的顧客:
public ilistgetcustomerswithcustomeridgreaterthan(int customerid)
nhibernate動態查詢
icriteria icriteria sessionfactory.getcurrentsession createcriteria typeof cardtype if cardtype.cardtypeid null if cardtype.cardtypeid null if cardtyp...
NHibernate輸出SQL語句
用了nhierbate之後,很少需要寫原生的sql語句,由於總是看不到sql語句,所以有時候對sql調優非常不利。因此產生了讓nhibernate輸出它所生成的sql語句的想法,以便於後續調優。在控制台程式中,要檢視nhibernate所生成的sql語句,方法非常簡單,只需要改下配置檔案就ok了。p...
NHibernate查詢優化的相關資料
一.1.立即載入 lazy false 並不能在所有情況下都會減少sql語句,同時還會帶來過量讀取資料的嚴重後果 由上面的分析可知,關聯實體和集合最好保持預設的延遲載入,所以我在實際的開發中是不進行任何lazy false設定的。如果要同時載入關聯實體或集合,最有效的方法就是編寫join和 dyna...