`
a453228609
  • 浏览: 35554 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NHibernate说探——Criteria条件查询

阅读更多
条件查询

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 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>



开始

(一) 返回所有实例(返回所有雇员)

这里返回的所有实例,且是全部的属性(字段)

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[]类型的

分享到:
评论

相关推荐

    NHibernate HQL 条件查询

    在探讨NHibernate HQL条件查询时,我们首先要理解NHibernate框架以及HQL(Hibernate Query Language)的基本概念。NHibernate是一个开放源代码的对象关系映射(ORM)解决方案,它为.NET平台提供了一种将对象模型与...

    NHibernate.dll下载

    5. **查询(Queries)**:NHibernate提供了HQL(Hibernate Query Language)和 Criteria 查询,允许以面向对象的方式编写数据库查询,而不是直接写SQL。 6. **事务(Transactions)**:通过NHibernate,你可以方便...

    NHibernate实例+数据库2005

    HQL是面向对象的查询语言,而Criteria API允许动态构建查询条件。 **三、代码分层** 1. **分层架构**:NHibernate实例中的代码分层是软件设计的一种良好实践,它包括表示层(UI)、业务逻辑层(BLL)、数据访问层...

    NHibernate3.2

    - 使用NHibernate进行数据持久化的API,如Session、Transaction、Criteria查询、HQL语言等。 - 如何映射对象模型到数据库表,包括实体类的注解和映射文件。 - NHibernate的事件监听器和拦截器机制,用于自定义行为。...

    Nhibernate

    此外,Nhibernate还支持 Criteria 查询和 LINQ-to-NHibernate,提供了不同的查询方式。 **懒加载和级联操作**: Nhibernate支持懒加载机制,即只有在真正需要访问关联对象时才会去数据库加载。这有助于提高性能,...

    NHibernate 3.2实例

    - Criteria查询是一种基于对象的API,可以动态构建查询,适用于不固定查询条件的情况。 - Linq to NHibernate则为.NET开发者提供了熟悉的Linq查询语法。 6. **性能优化** - 使用二级缓存提高性能,如Redis或...

    NHibernate

    除了HQL之外,NHibernate还支持另一种强大的查询方式——CriteriaQuery。这种方式更接近于编程语言,允许开发人员以编程的方式构造查询条件。 #### 根据示例查询 如果希望根据现有的对象实例进行查询,可以使用...

    ASP.NET源码——[博客空间]大刘单用户Blog(NHibernate三层)源码.zip

    3. 查询优化:提供HQL(NHibernate查询语言)和 Criteria API,使得开发者可以以面向对象的方式编写数据库查询,同时支持SQL的高效执行。 4. 支持事务管理:NHibernate内置对ACID事务的支持,确保数据一致性。 ...

    nhibernate例子

    NHibernate提供两种查询方式:Hibernate Query Language (HQL) 和 Criteria API。HQL是一种面向对象的查询语言,类似SQL,但操作的是对象而非表。Criteria API则提供了一种更面向对象的方式来构建查询,无需编写字符...

    学习Nhibernate的资料

    5. **查询语言(HQL)和 Criteria 查询**:Nhibernate提供了自己的SQL方言——HQL(Hibernate Query Language),以及Criteria API,它们允许以面向对象的方式进行数据库查询。 6. **延迟加载(Lazy Loading)和瞬...

    Nhibernate实例

    此外,还可以使用Criteria API或Linq to NHibernate进行更灵活的查询。 ```csharp var user = session.CreateQuery("FROM User WHERE Name = 'John Doe'") .UniqueResult(); ``` ### 9. 事务处理 Nhibernate支持...

    实战C#.NET编程----Spring.NET & NHibernate从入门到精通

    这部分内容涵盖了实体映射、会话管理、查询语言(HQL)和 Criteria 查询,以及高级特性如懒加载和级联操作。为了帮助读者更好地理解这些概念,书中将结合实际案例,展示如何在真实项目中运用Spring.NET和NHibernate...

    NHibernate文档

    3. **持久化模型**:NHibernate支持两种持久化模型——主动记录(Active Record)和领域驱动设计(Domain Driven Design,DDD)。主动记录模式中,实体类通常包含数据访问方法,而DDD模式中,数据访问逻辑被封装在...

    NHibernate文档(html).rar

    5. **查询API**:包括HQL(Hibernate Query Language)——面向对象的查询语言,以及 Criteria 查询,它们提供了灵活的检索对象的方式。 6. **事件系统**:NHibernate支持各种事件监听器,如FlushEvent、...

    ASP.NET-[博客空间]BruceBlog程序源码(采用NHibernate).zip

    在BruceBlog中,可以使用HQL来编写动态、灵活的查询,或者利用Criteria API构造查询条件,使代码更具可读性和可维护性。 5. **缓存策略**:为了提高性能,BruceBlog可能会利用NHibernate的缓存机制,如一级缓存...

    Packtpub.NHibernate.2.Beginners.Guide.May.2010.rar

    此外,还会介绍NHibernate的查询机制,包括使用HQL(Hibernate Query Language)和Criteria API来执行查询,以及如何进行分页和排序。 在处理复杂对象关系时,如一对一、一对多、多对多关系,本书会提供实例和最佳...

Global site tag (gtag.js) - Google Analytics