天天看點

NHibernate說探——Select,From,Where

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>

轉載請注明:部落格園