nhibernate原始碼七 HQL資料載入

2021-09-05 15:49:15 字數 1096 閱讀 4060

nh中,hql是乙個十分強大的物件導向的查詢語言,簡單的說,就是不需要使用實際的表名和列名來查詢資料,而改用類名和屬性。

有兩種方式來執行hql資料載入,一種是直接使用isession的find方法,另一種是使用iquery介面。

iquery介面提供了一些額外的設定,最重要的就是分頁了,這個和icriteria差不多,另外一些就是設定引數的值了。

iquery最終還是會呼叫isession的find方法,下面來分析一下iquery中hql語句的處理.

示例**:

iquery query = session.createquery( " from user u where u.name = :name " )

query.setstring( "name", "billy" );

ilist users = query.list();

原始碼分析:

// take the union of the query spaces (ie the queried tables)

querytranslator q = new querytranslator[concretequeries.length];

arraylist qs = new arraylist();

for (int i=0; ireturn q;

}分析hql查詢文字,如果是由多個sql語句組成,就要將其進行分割,最後由會話工廠根據hql文字建立querytranslator物件。

//*** sessionfactoryimpl.cs 429行 ***

private querytranslator getquery(string query, bool shallow)

q.compile(this, query, querysubstitutions, shallow);

return q;

}檢查在快取中是否已存在相同的querytranslator物件,如沒有,則建立乙個並將其放入快取,

然後呼叫querytranslator的compile方法對hql查詢文字進行解析, 有關解析sql的細節,請參考解析hql語句。

NHibernate原始碼分析之三 續 資料持久化

當持久化物件時,顯然必須存在把記錄的值賦值到物件屬性和取得物件屬性的值用於持久化操作,對於更新操作,還需要檢查物件的值是否已發生變化,即是否為dirty,這些操作都是由物件的持久化類來完成的。有關持久化類可參考 會話和持久化操作 一文。下面對nh的原始碼進行分析,以了解nh中資料載入和更新的過程。一...

NHibernate原始碼三 續 資料持久化

materialize associations and initialize the object later hydratedobjects.add obj for int i 0 iif persister.ismutable cannotdirtycheck dirtyproperties ...

rnnlm原始碼分析 七

系列前言 rnnlm recurrent neural network language modeling toolkit 點此閱讀 recurrent neural network based language model 點此閱讀 extensions of recurrent neural n...