博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[NHibernate]HQL查询
阅读量:5877 次
发布时间:2019-06-19

本文共 4103 字,大约阅读时间需要 13 分钟。

目录

写在前面

上篇文章介绍了nhibernate在项目中的基本配置,包括数据库连接字符串的设置,映射文件的配置及需注意的地方,这篇文章将介绍nhibernate的查询方法。

文档与系列文章

 

 

查询的几种方式

nhibernate中常见的查询方式有以下三种:

  1. NHibernate查询语言(HQL,NHibernate Query Language)。
  2. 条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况)。
  3. 原生SQL(Literal SQL,T-SQL、PL/SQL)。

HQL查询

这篇文章着重介绍HQL查询方式。

HQL(Hibernate Query Language)查询提供了更加丰富的和灵活的查询特性,因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语句的查询方式,同时也提供了更加面向对象的封装。

完整的HQL语句形式如下:

Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc

其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。(来自百度百科)

注意:HQL是基于面向对象的查询语言。

该怎样理解这就话呢?和sql不同,HQL中的查询的是对象的属性。例如

1         ///  2         /// 根据客户姓名进行模糊查询 3         ///  4         /// 查询条件 5         /// 
满足条件的客户信息
6 public IList
SearchByName(string strName) 7 { 8 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 9 ISession session = nhibernateHelper.GetSession();10 //from后面跟的是持久化类Customer而不是数据表名TB_Customer11 return session.CreateQuery("from Customer as customer where customer.CustomerName like '%" + strName + "%'").List
();12 }

在from后面跟的是持久化类的名,而不是表名。否则会出现如下异常:

同样也支持select,查询多个属性时返回的是IList<Object[]> object数组泛型集合。

1         ///  2         /// 根据客户姓名进行模糊查询 3         ///  4         /// 查询条件 5         /// 
满足条件的客户信息
6 public IList
SearchByName(string strName) 7 { 8 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 9 ISession session = nhibernateHelper.GetSession();10 //from后面跟的是持久化类Customer而不是数据表名TB_Customer11 return session.CreateQuery("select customer.CustomerID,customer.CustomerName,customer.CustomerAddress from Customer as customer where customer.CustomerName like '%" + strName + "%'").List
();12 }

当查询单个属性时,例如查询所有客户的id,此时返回IList<Guid>

1         ///  2         /// 获得所有客户的id 3         ///  4         /// 
5 public IList
GetAllCustomerID() 6 { 7 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 8 ISession session = nhibernateHelper.GetSession(); 9 return session.CreateQuery("select customer.CustomerID from Customer as customer").List
();10 }

另外的order by ,group by,distinct的使用与sql类似,就不再举例子了。

注意:在HQL中,也是大小写不敏感的,也就是不区分大小写的。

一个例子

where条件子句中除sql的大部分情况外,还支持命名参数和位置参数。

根据用户名查询客户信息

1         ///  2         /// 根据姓名查询客户信息 3         ///  4         ///  5         /// 
6 public IList
GetCustomerByName(string strName) 7 { 8 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 9 ISession session = nhibernateHelper.GetSession();10 //方式一11 // return session.CreateQuery("from Customer c where c.CustomerName='" + strName + "'").List
();12 //方式二:位置型参数13 //return session.CreateQuery("from Customer c where c.CustomerName=?")14 // .SetString(0, strName)15 // .List
();16 //写法3:命名型参数(推荐)17 return session.CreateQuery("from Customer c where c.CustomerName=:cn")18 .SetString("cn", strName)19 .List
();20 }

以上代码,列出了常见的三种风格的HQL语句写法。

方式一:类似ADO.NET中的一般查询语句的写法,此种写法可能造成SQL注入,不建议使用。

方式二:ADO.NET风格的?参数,NHibernate的参数从0开始计数。

方式三:命名参数用:name的形式在查询字符串中表示,这时IQuery接口把实际参数绑定到命名参数。(类似ADO.NET中参数化查询,推荐这种查询方式)。

我们监控一下方式三生成的sql语句:

 

通过上图我们发现,在生成的sql中,查询条件为:

customer0_.CustomerName=@p0',N'@p0 nvarchar(4000)',@p0=N'wolfy'

@p0参数,再执行存储过程,将实参wolfy字符串赋给参数@p0了。

总结

HQL查询是基于面向对象的,在使用查询是from后面的是持久化类对象,而不是数据表表名,这点应该注意。其它的地方跟sql查询比较类似,比如order by ,group by,统计函数的使用等。

在使用hql查询时,推荐使用命名参数的方式查询。

参考文章

博客地址:
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。
转载:http://www.cnblogs.com/wolf-sun/p/4034510.html
你可能感兴趣的文章
CSS魔法堂:Transition就这么好玩
查看>>
【OpenStack】network相关知识学习
查看>>
centos 7下独立的python 2.7环境安装
查看>>
[日常] 算法-单链表的创建
查看>>
前端工程化系列[01]-Bower包管理工具的使用
查看>>
使用 maven 自动将源码打包并发布
查看>>
Spark:求出分组内的TopN
查看>>
Python爬取豆瓣《复仇者联盟3》评论并生成乖萌的格鲁特
查看>>
关于跨DB增量(增、改)同步两张表的数据小技巧
查看>>
飞秋无法显示局域网好友
查看>>
学员会诊之03:你那惨不忍睹的三层架构
查看>>
vue-04-组件
查看>>
Golang协程与通道整理
查看>>
解决win7远程桌面连接时发生身份验证错误的方法
查看>>
C/C++ 多线程机制
查看>>
js - object.assign 以及浅、深拷贝
查看>>
python mysql Connect Pool mysql连接池 (201
查看>>
Boost在vs2010下的配置
查看>>
一起谈.NET技术,ASP.NET伪静态的实现及伪静态的意义
查看>>
20款绝佳的HTML5应用程序示例
查看>>