NHibernate查询之HQL&Criteria

一、什么是HQL(NHibernate Query Language)查询语言

Ø    定义:NHibernate查询语言(HQL,NHibernate Query Language)是NHibernate特有的基于面向对象的SQL查询语言,它具有继承、多态和关联等特性。

Ø    它如何运行:HQL查询的是通过ORM模式映射出来的类,然后再根据映射文件和hibernate.cfg.xml文件,动态生成SQL语句到数据库中执行。

Ø    注意事项:因为HQL中查询的表和字段实际是映射而来的类和其属性,所以这些表和字段是区分大小写的,但是HQL关键字不区分大小写,这点请特别注意。

Ø    优点:如果进行了数据库的迁移,只需要修改Hibernate.cfg.xml和映射文件即可,这是我的理解,但感觉这个优点并不明显。

 

二、HQL关键字及其用法

在DAL的NHibernateSample中添加以下各个函数

1)       from和as

   //使用IList<>返回多行数据

        public IList<Customer> fromAndAs()

        {   //当返回为类的实例时,不需要select;as关键字可以省略;返回为多行时使用List ()函数

            IList<Customer> customers = session.CreateQuery("from Customer csm").List<Customer>();

            return customers;

        }

 

2)       select

        public IList<int> Select()

        {

            return session.CreateQuery("select csm.CustomerId from Customer csm").List<int>();

        }

 

3)       select和group by

        public IList<object[]> SelectObjectAndGroupBy()

        {

            return session.CreateQuery("select csm.Firstname, count(*) from Customer csm group by csm.Firstname").List<object[]>();

        }

 

4)       distinct

        public IList<string> Distinct()

        {

            return session.CreateQuery("select distinct csm.Firstname from Customer csm").List<string>();

        }

 

5)       where

        public IList<Customer> Where()

        {

            //return session.CreateQuery("from Customer csm where csm.FirstName='luo'").List<Customer>();

            //下面为参数化写法,可读性好、条理清晰、安全,推荐使用

            return session.CreateQuery("from Customer csm where csm.Firstname=:fn")

                .SetString("fn", "luo")

                .List<Customer>();

        }

下面是where子句允许出现的表达式包括了在SQL中的大多数情况:

Ø         数学操作符:+, -, *, /

Ø         真假比较操作符:=, >=, <=, <>, !=, like

Ø         逻辑操作符:and, or, not

Ø         字符串连接操作符:||  

Ø         SQL标量函数:upper(),lower()

Ø         没有前缀的( ):表示分组

Ø         in, between, is null

Ø         位置参数:?

Ø         命名参数::name, :start_date, :x1

Ø         SQL文字:'foo', 69, '1970-01-01 10:00:01.0'

Ø         枚举值或常量:Color.Tabby 

 

6)       order by

        public IList<Customer> OrderBy()

        {

            return session.CreateQuery("from Customer csm order by csm.CustomerId desc").List<Customer>();

        }

 

三、测试

添加如下代码到DAL.Test的NHibernateSampleTest.cs中,然后使用调试方法测试运行,跟踪结果是否正确

       [Test]

        public void KeywordTest()

        {

            IList<Customer> values = sample.fromAndAs();

            //IList<int> values = sample.Select();

            //IList<object[]> values = sample.SelectObjectAndGroupBy();

            //IList<string> values = sample.Distinct();

            //IList<Customer> values = sample.Where();

            //IList<Customer> values = sample.OrderBy();

        }

 

 

五、条件查询(Criteria Query)

HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而不是在.NET代码中嵌入字符串。在NHibernate中,提供了一种直观的、可扩展的Criteria API。在我们键入查询语句的时候,提供了编译时的语法检查,VS提供了强大的智能提示。如果你对HQL的语法感觉不是很舒服的话,用这种方法可能更容易。这种API也比HQL更可扩展。

 

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

 

六、创建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;

}

 

七、结果集限制

使用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;

}

 

八、结果集排序

使用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>();

}

 


三、NHibernate查询之HQL&Criteria

一、什么是HQL(NHibernate Query Language)查询语言

Ø    定义:NHibernate查询语言(HQL,NHibernate Query Language)是NHibernate特有的基于面向对象的SQL查询语言,它具有继承、多态和关联等特性。

Ø    它如何运行:HQL查询的是通过ORM模式映射出来的类,然后再根据映射文件和hibernate.cfg.xml文件,动态生成SQL语句到数据库中执行。

Ø    注意事项:因为HQL中查询的表和字段实际是映射而来的类和其属性,所以这些表和字段是区分大小写的,但是HQL关键字不区分大小写,这点请特别注意。

Ø    优点:如果进行了数据库的迁移,只需要修改Hibernate.cfg.xml和映射文件即可,这是我的理解,但感觉这个优点并不明显。

 

二、HQL关键字及其用法

在DAL的NHibernateSample中添加以下各个函数

1)       from和as

   //使用IList<>返回多行数据

        public IList<Customer> fromAndAs()

        {   //当返回为类的实例时,不需要select;as关键字可以省略;返回为多行时使用List ()函数

            IList<Customer> customers = session.CreateQuery("from Customer csm").List<Customer>();

            return customers;

        }

 

2)       select

        public IList<int> Select()

        {

            return session.CreateQuery("select csm.CustomerId from Customer csm").List<int>();

        }

 

3)       select和group by

        public IList<object[]> SelectObjectAndGroupBy()

        {

            return session.CreateQuery("select csm.Firstname, count(*) from Customer csm group by csm.Firstname").List<object[]>();

        }

 

4)       distinct

        public IList<string> Distinct()

        {

            return session.CreateQuery("select distinct csm.Firstname from Customer csm").List<string>();

        }

 

5)       where

        public IList<Customer> Where()

        {

            //return session.CreateQuery("from Customer csm where csm.FirstName='luo'").List<Customer>();

            //下面为参数化写法,可读性好、条理清晰、安全,推荐使用

            return session.CreateQuery("from Customer csm where csm.Firstname=:fn")

                .SetString("fn", "luo")

                .List<Customer>();

        }

下面是where子句允许出现的表达式包括了在SQL中的大多数情况:

Ø         数学操作符:+, -, *, /

Ø         真假比较操作符:=, >=, <=, <>, !=, like

Ø         逻辑操作符:and, or, not

Ø         字符串连接操作符:||  

Ø         SQL标量函数:upper(),lower()

Ø         没有前缀的( ):表示分组

Ø         in, between, is null

Ø         位置参数:?

Ø         命名参数::name, :start_date, :x1

Ø         SQL文字:'foo', 69, '1970-01-01 10:00:01.0'

Ø         枚举值或常量:Color.Tabby 

 

6)       order by

        public IList<Customer> OrderBy()

        {

            return session.CreateQuery("from Customer csm order by csm.CustomerId desc").List<Customer>();

        }

 

三、测试

添加如下代码到DAL.Test的NHibernateSampleTest.cs中,然后使用调试方法测试运行,跟踪结果是否正确

       [Test]

        public void KeywordTest()

        {

            IList<Customer> values = sample.fromAndAs();

            //IList<int> values = sample.Select();

            //IList<object[]> values = sample.SelectObjectAndGroupBy();

            //IList<string> values = sample.Distinct();

            //IList<Customer> values = sample.Where();

            //IList<Customer> values = sample.OrderBy();

        }

 

 

五、条件查询(Criteria Query)

HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而不是在.NET代码中嵌入字符串。在NHibernate中,提供了一种直观的、可扩展的Criteria API。在我们键入查询语句的时候,提供了编译时的语法检查,VS提供了强大的智能提示。如果你对HQL的语法感觉不是很舒服的话,用这种方法可能更容易。这种API也比HQL更可扩展。

 

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

 

六、创建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;

}

 

七、结果集限制

使用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;

}

 

八、结果集排序

使用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>();

}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/soldierluo/archive/2009/10/12/4657093.aspx

分类: NHibernate
0
0
(请您对文章做出评价)
« 博主前一篇: 二、第一个NHibernate程序
» 博主后一篇: TestDriven.NET 2.0单元测试
posted @ 2010-02-26 12:15 KiNg.JiOnG 阅读(220) 评论(0) 编辑 收藏


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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值