HQL查詢
這裡以Northwind資料庫為示例資料庫
示例資料表:Employees
現在隻用雇員表中部分字段。
持久類如下:
public class Employees
{
public virtual int EmployeeID { get; set; }
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
public virtual DateTime BirthDate { get; set; }
public virtual string Address { get; set; }
public virtual string City { get; set; }
public virtual string PostalCode { get; set; }
}
映射檔案如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">
<class name="Employees" table="Employees">
<id name="EmployeeID" column="EmployeeID">
<generator class="identity"></generator>
</id>
<property name="LastName" column="LastName" type="String"></property>
<property name="FirstName" column="FirstName" type="String"></property>
<property name="BirthDate" column="BirthDate" type="DateTime"></property>
<property name="Address" column="Address" type="String"></property>
<property name="City" column="City" type="String"></property>
<property name="PostalCode" column="PostalCode" type="String"></property>
</class>
</hibernate-mapping>
開始
(一)From
(1) 傳回所有執行個體(傳回所有雇員)
IQuery q = _session.CreateQuery("from Employees");
return q.List<Employees>();
這種傳回的是所有執行個體,且為持久類型。從哪個映射查詢,就傳回哪個映射的持久類型。
·表别名使用
用法與SQL一樣,可以直接在 Employees 後加别名,也可以用as
IQuery q = _session.CreateQuery("from Employees e");
或
IQuery q = _session.CreateQuery("from Employees as e");
·面向對象的了解
從持久類(其實映射的為資料庫表Employees表)查詢,這裡的Employees為持久類,全名為Domain.Entities.Employees
是以,完整的查詢應該是:
IQuery q = _session.CreateQuery("from Domain.Entities.Employees as e");
是以從這裡,可以了解為什麼這裡要區分大小寫
(2)傳回部分執行個體(傳回2個雇員)
q.SetMaxResults(2);
(二)Select
(1) 傳回所有字段的執行個體
IQuery q = _session.CreateQuery("select e from Employees e");
·select是構造傳回類型的關鍵字,這裡與SQL有些不同。Sql中傳回所有字段,可以用*,但這裡不可以。須用表别名才可以。
(2)傳回單個字段(城市)
IQuery q = _session.CreateQuery("select City from Employees");
return q.List<string>();
·這裡的City要區分大小寫。因為這裡是做為對象的屬性來使用的。其實全名應該為:
IQuery q = _session.CreateQuery("select e.City from Employees e");
·傳回的屬性是什麼類型,則傳回的結果應該為相應的類型。查詢城市屬性,此屬性在持久類中為:
public virtual string City { get; set; }
是以結果為:q.List<string>()
(3)傳回多字段(城市與名字)
public IList<Employees> ShowNameCity()
{
IQuery q = _session.CreateQuery("select City,FirstName from Employees");
List<object[]> _objs = q.List<object[]>() as List<object[]>;
IList<Employees> _list = new List<Employees>();
_list = _objs.ConvertAll<Employees>(new Converter<object[], Employees>(GetEmployees));
return _list;
}
public Employees GetEmployees(object[] aa)
return new Employees
{
City = (string)aa[0],
FirstName = (string)aa[1]
};
}
這裡說明一下,對于傳回的多字段這個比較複雜,它傳回的是object[] 數組。其實這點也是可以了解的。查詢時它找不到與之完全比對的持久對象,是以傳回的是雜項的,可以用多對象多屬性來表示這一特征。
可以用單步分解的方式進行傳回結果的包裝:
IList<Employees> _list = new List<Employees>();
for (int i = 0; i < _objs.Count; i++)
_list.Add(new Employees {
City = (string)_objs[i][0],
FirstName = (string)_objs[i][1]
});
}
也可以直接對對象進行包裝。這裡用到了持久類的構造方法。可以這樣:
構造方法:
public Employees(string strCity, string strFirstName)
City = strCity;
FirstName = strFirstName;
查詢:
IQuery q = _session.CreateQuery("select new Employees(City,FirstName) from Employees");
·說明一下:構造對象可以随心所欲。可以從新定義一個類(隻做為一個實體類型即可),帶有相符的屬性類型,就可以構造了。
·如果用到預設的構造方法,在加參構造後,應該補充預設的構造方法。
(三) Where(條件)
(1)查詢雇員,以城市為條件
IQuery q = _session.CreateQuery("from Employees where City=:City")
.SetString("City", strCity);
·HQL條件與SQL差別不大
(2)查詢聯合的屬性
現在改一下持久類與映射檔案。定義雇員的一個新屬性:全名。類型為全名類型。(保留原先的屬性,隻增加新屬性)
public virtual FName FullName { get; set; }
public class FName
{
public string FirstNamee { get; set; }
public string LastNamee { get; set; }
public string FullName
{
get
{
return FirstNamee + "·" + LastNamee;
}
}
}
<component name="FullName" class="Domain.Entities.FName,Domain">
<property name="FirstNamee" column="FirstName"></property>
<property name="LastNamee" column="LastName"></property>
</component>
查詢名字為Nancy的雇員
IQuery q = _session.CreateQuery("from Employees e where e.FullName.FirstNamee=:FirstNamee")
.SetString("FirstNamee", "Nancy");
這裡要說明的就是點文法的複合路徑
部落格園大道至簡
<a href="http://www.cnblogs.com/jams742003/" target="_blank">http://www.cnblogs.com/jams742003/</a>
轉載請注明:部落格園