閱讀917 返回首頁    go 阿裏雲 go 技術社區[雲棲]


NHibernate - ICriteria 查詢

條件查詢

NHibernate.ICriteria接口表示特定持久類的一個查詢。ISession是 ICriteria實例的工廠。

這裏以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 table="Employees">

    <id column="EmployeeID">

      <generator ></generator>

    </id>

    <property column="LastName" type="String"></property>

    <property column="FirstName" type="String"></property>

    <property column="BirthDate" type="DateTime"></property>

    <property column="Address" type="String"></property>

    <property column="City" type="String"></property>

    <property column="PostalCode" type="String"></property>

  </class>

</hibernate-mapping>

開始

(一) 返回所有實例(返回所有雇員)

這裏返回的所有實例,且是全部的屬性(字段)

ICriteria crt = _session.CreateCriteria(typeof(Employees));           

return crt.List<Employees>();

Isession創建條件查詢實例有4個構造方法。

(二)  返回部分實例(返回2個雇員)

ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.SetMaxResults(2);

return crt.List<Employees>();

(三)條件查詢的約束條件

(1)Expression

ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.Add(Expression.Eq("City","London"));

        return crt.List<Employees>();

       查詢內容為:雇員的城市是在倫敦的。其中Expression的名字空間為:NHibernate.Criterion

Expression類 定義了獲得某些內置ICriterion類型的工廠方法,這裏用到了等於

(2)Restrictions

ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.Add(Restrictions.Eq("City", "London"));

return crt.List<Employees>();

查詢內容為:雇員的城市是在倫敦的。其中Restrictions的名字空間為:NHibernate.Criterion

(3)通過實例來查詢

Employees ee = new Employees { City = "London", BirthDate = Convert.ToDateTime("1955-03-04 00:00:00.000") };

         ICriteria crt = _session.CreateCriteria(typeof(Employees));

         crt.Add(Example.Create(ee));

     return crt.List<Employees>();

查詢倫敦的,生日在那個時間的。(為什麼這裏我要加個生日上去?因為我的持久類中有這個屬性,如果在實例查詢中不給定這個值,會有日期越界的異常。在下邊的例子中,來處理這種情況)這是限製的相等的實現。下邊實現一個相似的例子:

Employees ee = new Employees { FirstName = "a"};

    Example exp=Example.Create(ee)

                .EnableLike(MatchMode.Start)

                .ExcludeProperty("BirthDate")

                .IgnoreCase();

    ICriteria crt = _session.CreateCriteria(typeof(Employees));

    crt.Add(exp);

return crt.List<Employees>();

這個例子中,指定相似的姓名等a,看實例exp:

·采用相似比較EnableLike

·相似比較匹配模式MatchMode.Start,開頭匹配,這個應該類似於SQL中的a%

·排除比較屬性ExcludeProperty,這個方法就是用於處理排除的。上個例子中日期沒給,所以會出現異常,而這個方法則排除了這種異常發生(其實就是排除不比較的屬性(字段))。

·忽略大小寫

(四)排序

ICriteria crt = _session.CreateCriteria(typeof(Employees));

crt.AddOrder(new NHibernate.Criterion.Order("FirstName", true));

return crt.List<Employees>();

排序字段:名字,升序(true)

(五)聚合

(1)查詢人數

ICriteria crt = _session.CreateCriteria(typeof(Employees));

         crt.SetProjection(Projections.RowCount());

return crt.List();

NHibernate.Expression.Projections是 IProjection 的實例工廠。通過調用 SetProjection()應用投影到一個查詢。

(2)Avg

從這個開始到以下的例子又回到以Products為示例數據表

       ICriteria crt = _session.CreateCriteria(typeof(Products));           

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Avg("Price"))

                );

     return crt.List();

通過投影列表來添加投影聚合方法。

這裏取得產品的平均價格,這裏沒有條件約束,下邊這個例子取得產品類別為2的產品的平均價格:

ICriteria crt = _session.CreateCriteria(typeof(Products));           

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Avg("Price")))

                .Add(Expression.Eq("CategoryID",2));

    return crt.List();

(3)Max(最大價格)

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Max("Price")));

     return crt.List();

(4)Min(最低價格)

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Min ("Price")));

     return crt.List();

(5)Sum(和)

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.Sum ("Price")));

     return crt.List();

(6)分組

ICriteria crt = _session.CreateCriteria(typeof(Products));

         crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.GroupProperty("CategoryID")));

     return crt.List<int>();

這個分組隻是返回一個屬性,所以用int泛型可以了。下邊的例子返回分組,並返回各組的數目

ICriteria crt = _session.CreateCriteria(typeof(Products));

    crt.SetProjection(Projections.ProjectionList()

                .Add(Projections.GroupProperty("CategoryID"))

                .Add(Projections.RowCount()));

return crt.List();

·這裏的List為System.Collections.Ilist,且是object[]類型的

轉自:https://www.cnblogs.com/360S/archive/2011/09/28/2193910.html

最後更新:2017-04-03 16:48:31

  上一篇:go 第三章 AOP 通過Java API創建切麵
  下一篇:go Design Pattern: Registry of Singleton 模式