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

转载于:https://www.cnblogs.com/kingjiong/archive/2010/02/26/1674163.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值