一、什么是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
}
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
{
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()标签:csm,Customer,return,List,session,IList,Criteria,HQL,NHibernate From: https://blog.51cto.com/u_15906220/5920730
{
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>();
}