NHibernate条件查询(Criteria Query)

来源:互联网 发布:男士发型软件 编辑:程序博客网 时间:2024/05/22 04:55

NHibernate条件查询(Criteria Query)

条件查询(Criteria Query)

1)创建ICriteria实例

2)结果集限制

3)结果集排序

4)说明

条件查询(Criteria Query)

HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,尾部是在.NET代码中嵌入字符串。在NHibernate中,提供了一种直观的、可扩展的Criteria  API

在我们键入查询语句的时候,提供了变异时的语法检查,VS提供了强大的智能提示。如果你对HQL的语法感觉不是很舒服的话,用这种方法可能更容易。这种API也比HQL更可扩展。

典型用法:从ISession接口中创建ICriteria实例对象;在这里ICriteria实例对象上设置一个活多个表达式;要求ICriteria接口返回需要的列表,就是根据表达式从数据库中返回对象。

1.创建ICriteria实例

使用ISession接口的CreateCriteria方法创建了NHibernate.ICriteria接口一个特定的持久化类的查询实例,也可以说ISession是用来制造Criteria实例的工厂。

Public IList<Customer>VreateCriteria()

{

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”,”young%”)).Add(Restrictions.Between(“Lastname”,”A%”,”Y”%)).List<Customer>();

Return customers;

}

3.结果集排序

使用ICriteria.Order对结果集排序,第二个参数true代表ascfalse代表desc

查询Customer对象按FirstName降序、Lastname升序。

Public IList<Customer>Order()

{

Return _session.CreateCreteria(typeof(Customer)).Add(Restrictions.Like(“Firstname”,”y%”)).AddOrder(new NHIbernate.Criterion.Order(“Firstname”,false)).AddOrder(new NHibernate.Criterion.Order(“Lastname”,true)).List<Customer>();

}

条件查询同样支持关联查询、动态关联抓取,投影、聚合和分组,离线查询和子查询。

根据示例查询(Query By Example)

根据示例查询是条件查询的一种特殊情况,NHibernate.Criterion.Example类是根据你指定的实例创造查询条件。其典型的用法:创建一个Example实例:在Example实例上设置值:根据Example和设置NHibernate返回其对象集合。

Public IList<Cutomer>Query()

{

Customer customerSample=new Customer(){Firstname=”young”,Lastname=”y”};

Return _sessiom.CreateCriteria(typeof(Customer)).Add(Example.Create(customerSample)).List<Customer>();

}

你可以自行调整Example使之更实用:

Public IList<Customer>UserQueryByExample_GetCustomer(Customer customerSample)

{

Example example=newExample.Create(customerSample).IgnoreCase().EnableLike().SetEscapeCharacter(‘&’);

Return _session.CreateCritera(typeof(Customer)).Add(example).List<Cutomer>();

}

实例分析

1)利用CriteriaAPIFirstnameLastname查询顾客。

Public IList<Customer>GetCustomerByFirstnmaeAndLastname(string firstname,string lastname)

{

Return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Eq(“Firstname”,firstname)).Add(Restrictions.Eq(“Lastname”,lastname)).List<Customer>();

}

测试:调用GetCustomerByFirstnameAndLastname方法,查询Firstname”young”,Lastname”Y”的顾客,判断查询结果数量是否为1.

[Test]

Public void GetCustomerByFirstnameAndLastnameTest()

{

IList<Customer>customers=new _queryCriteriaAPI.GetCustomersBYFirstnameAndLastname(“young”,”Y”);

Assert.AreEqual(1,customers.Count);

}

2)利用CriteriaAPI获取顾客ID大于CustomerId的顾客。

Publick IList<Customer>GetCustomersWithIdGreaterThan(int customerId)

{

Return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Get(“CustomerId”,customerId)).List<Customer>();

}