程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> NHibernate之旅(4):探索查詢之條件查詢(Criteria Query)

NHibernate之旅(4):探索查詢之條件查詢(Criteria Query)

編輯:關於.NET

本節內容

NHibernate中的查詢方法

條件查詢(Criteria Query)

1.創建ICriteria實例

2.結果集限制

3.結果集排序

4.一些說明

根據示例查詢(Query By Example)

實例分析

結語

上一節,我們介紹了NHibernate查詢語言的一種:NHibernate查詢語言(HQL,NHibernate Query Language),這一節介紹一下條件查詢(Criteria API)。

NHibernate中的查詢方法

在NHibernate中提供了三種查詢方式給我們選擇:NHibernate查詢語言(HQL,NHibernate Query Language)、條件查詢(Criteria API,Criteria Query)、(根據示例查詢(QBE,Query By Example)是條件查詢的一種特殊情況)、原生SQL(Literal SQL,T-SQL、PL/SQL)。每個人有不同的喜好和特長,可以根據自己的情況選擇使用其中的一種或幾種。這一節我們介紹條件查詢。

條件查詢(Criteria Query)

HQL極為強大,但是有些人希望能夠動態的使用一種面向對象API創建查詢,而不是在.NET代碼中嵌入字符串。在NHibernate中,提供了一種直觀的、可擴展的Criteria API。在我們鍵入查詢語句的時候,提供了編譯時的語法檢查,VS提供了強大的智能提示。如果你對HQL的語法感覺不是很舒服的話,用這種方法可能更容易。這種API也比HQL更可擴展。

典型用法:從ISession接口中創建ICriteria實例對象;在這個ICriteria實例對象上設置一個或多個表達式;要求ICriteria接口返回需要的列表,就是根據表達式從數據庫中返回對象。

注意:由於篇幅有限,我在這裡僅僅貼出了數據訪問層的代碼。測試這些方法的代碼就沒有貼出來了,你可以下載本系列的源代碼仔細看看測試這些方法的代碼。這些實例我爭取寫出來可以運行起來,大家下載源碼看看效果,一些數據需要按個人數據庫裡的數據情況修改。例如查詢條件和結果。這節,我們在上一節源代碼的基礎上,在數據訪問層中新建QueryCriteriaAPI.cs類用於編寫條件查詢方法,在數據訪問的測試層新建一QueryCriteriaAPIFixture.cs類用於測試。

1.創建ICriteria實例

使用ISession接口的CreateCriteria方法創建了NHibernate.ICriteria接口一個特定的持久化類的查詢實例,也可以說ISession是用來制造Criteria實例的工廠。

public IList<Customer> CreateCriteria()
{
  ICriteria crit = _session.CreateCriteria(typeof(Customer));
  crit.SetMaxResults(50);
  IList<Customer> customers = crit.List<Customer>();
  return customers;
}

例如上面的例子返回Customer對象集合,設置最大的集合數量為50條。

2.結果集限制

使用ICriteria接口提供的Add方法添加Restrictions類中約束表達式可以限制一些結果集的作用。

public IList<Customer> Narrowing()
{
  IList<Customer> customers = _session.CreateCriteria(typeof(Customer))
    .Add(Restrictions.Like("Firstname", "YJing%"))
    .Add(Restrictions.Between("Lastname", "A%", "Y%"))
    .List<Customer>();
  return customers;
}

3.結果集排序

使用ICriteria.Order對結果集排序,第二個參數true代表asc,false代表desc。例如下面例子查詢Customer對象按FirstName降序、Lastname升序。

public IList<Customer> Order()
{
  return _session.CreateCriteria(typeof(Customer))
    .Add(Restrictions.Like("Firstname","Y%"))
    .AddOrder(new NHibernate.Criterion.Order("Firstname", false))
    .AddOrder(new NHibernate.Criterion.Order("Lastname", true))
    .List<Customer>();
}

4.一些說明

條件查詢同樣支持關聯查詢、動態關聯抓取(在介紹一對多,多對多關系中闡述),投影、聚合和分組,離線(detached)查詢和子查詢是2.0版新增加的內容,以後在相關知識中介紹。也可以自行參考NHibernate參考文檔13章。

根據示例查詢(Query By Example)

根據示例查詢(QBE,Query By Example)是條件查詢的一種特殊情況,NHibernate.Criterion.Example類根據你指定的實例創造查詢條件。其典型的用法:創建一個Example實例;在Example實例上設置值;根據Example和設置NHibernate返回其對象集合。

例如下面的例子,按照指定Customer查詢數據庫裡的記錄:

public IList<Customer> Query()
{
  Customer customerSample = new Customer() { Firstname = "YJing", Lastname = "Lee" };
  return _session.CreateCriteria(typeof(Customer))
    .Add(Example.Create(customerSample))
    .List<Customer>();
}

你可以自行調整Example使之更實用:

public IList<Customer> UseQueryByExample_GetCustomer(Customer customerSample)
{
  Example example = Example.Create(customerSample)
    .IgnoreCase()
    .EnableLike()
    .SetEscapeCharacter('&');
  return _session.CreateCriteria(typeof(Customer))
    .Add(example)
    .List<Customer>();
}

實例分析

實例1:利用CriteriaAPI按Firstname和Lastname查詢顧客。

public IList<Customer> GetCustomersByFirstnameAndLastname(string firstname, string lastname)
{
  return _session.CreateCriteria(typeof(Customer))
    .Add(Restrictions.Eq("Firstname", firstname))
    .Add(Restrictions.Eq("Lastname", lastname))
    .List<Customer>();
}

測試:調用GetCustomersByFirstnameAndLastname方法,查詢Firstname為“YJing",Lastname為"Lee"的顧客,判斷查詢結果數量是否為1。(注:在數據庫中有符合這一個記錄)

[Test]
public void GetCustomerByFirstnameAndLastnameTest()
{
  IList<Customer> customers =
    _queryCriteriaAPI.GetCustomersByFirstnameAndLastname("YJing", "Lee");
  Assert.AreEqual(1, customers.Count);
}

實例2:利用CriteriaAPI獲取顧客ID大於CustomerId的顧客。

public IList<Customer> GetCutomersWithIdGreaterThan(int customerId)
{
  return _session.CreateCriteria(typeof(Customer))
    .Add(Restrictions.Gt("CustomerId", customerId))
    .List<Customer>();
}

結語

好了,通過2篇文章的介紹,對NHibernate中的查詢語法有了大致了解,知道了NHibernate中兩種最主要的查詢方式,還有一種原生SQL查詢,內容不多,請參考NHibernate官方文檔吧。多多練習!下節將介紹對對象的操作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved