NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)
摘要
NHibernate在很早的版本就提供了SQL Query(原生SQL查询),对于很复杂的查询,如果使用其他的查询方式实现比较困难的时候,一般使用SQL Query。使用SQL Query是基于原生的SQL语句,查询后将结果做投影到NHibernate实体类对象的过程。也可以投影到其他任何.net集合类。
本篇文章的代码可以到NHibernate查询下载
1、from子句
public IList<Customer> GetAllSQL()
{
return Session.CreateSQLQuery("select * from Customer").AddEntity(typeof(Customer)).List<Customer>();
}
首先创建调用ISession.CreateSQLQuery方法,传入原生的SQL语句,生成ISQLQuery对象,这是使用SQL Query的第一步。
ISQLQuery.AddEntity方法传入类型参数,将查询结果映射到Customer类。
ISQLQuery.List方法立即执行,返回查询结果。
2、as子句提供别名,as可以省略
public IList<Customer> GetAllSQL()
{
return Session.CreateSQLQuery("select * from Customer as c").AddEntity(typeof(Customer)).List<Customer>();
}
3、指定列返回数组
public IList<int> SelectIdSQL()
{
return Session.CreateSQLQuery("select distinct c.Id from Customer c")
.AddScalar("Id", NHibernateUtil.Int32)
.List<int>();
}
ISQLQuery.AddScalar方法将查询语句的列映射到.net数据类型,传入的第一个参数是列名,第二个参数是类型,NHibernateUtil类中的公开了很多静态实例对象表示映射数据类型,这里使用Int32。
4、where子句
public IList<Customer> GetCustomerByNameSQL(string firstName, string lastName)
{
return Session.CreateSQLQuery("select * from Customer where FirstName = :firstName and LastName = :lastName")
.AddEntity(typeof(Customer))
.SetString("firstName", firstName)
.SetString("lastName", lastName)
.List<Customer>();
} public IList<Customer> GetCustomersStartWithSQL()
{
return Session.CreateSQLQuery("select * from Customer where FirstName like 'J%'")
.AddEntity(typeof(Customer))
.List<Customer>();
}
SQL Query的查询参数传递跟HQL参数传递是一样的。而且这里是使用原生的SQL语句,比HQL更方便。
5、order by子句
public IList<Customer> GetCustomersOrderBySQL()
{
return Session.CreateSQLQuery("select * from Customer c order by c.FirstName")
.AddEntity(typeof(Customer))
.List<Customer>();
}
6、关联查询
/// <summary>
/// 按分组查询客户Id及客户关联的订单数量
/// </summary>
/// <returns></returns>
public IList<object[]> SelectOrderCountSQL()
{
return Session.CreateSQLQuery("select c.Id, count(*) as OrderCount from Customer c inner join [Order] o on c.Id=o.CustomerId group by c.Id")
.AddScalar("Id", NHibernateUtil.Int32)
.AddScalar("OrderCount", NHibernateUtil.Int32)
.List<object[]>();
} /// <summary>
/// 查询所有订单数量大于2的客户信息
/// </summary>
/// <returns></returns>
public IList<Customer> GetCustomersOrderCountGreaterThanSQL()
{
string sql = @"select * from Customer
where Id in
(
select c.Id from Customer c inner join [Order] o on c.Id = o.CustomerId
group by c.Id
having count(*) > 2
)";
return Session.CreateSQLQuery(sql)
.AddEntity(typeof(Customer))
.List<Customer>();
} /// <summary>
/// 查询在指定日期到当前时间内有下订单的客户信息
/// </summary>
/// <param name="orderDate"></param>
/// <returns></returns>
public IList<Customer> GetCustomersOrderDateGreatThanSQL(DateTime orderDate)
{
return Session.CreateSQLQuery("select distinct c.* from Customer c inner join [Order] o on c.Id=o.CustomerId where o.Ordered > :orderDate")
.AddEntity(typeof(Customer))
.SetDateTime("orderDate", orderDate)
.List<Customer>();
}
注意这几个方法都是传入的原生SQL语句,不管多复杂的查询,只要会写SQL语句,就能够使用SQL Query返回对象集合。
如果是多个表的联合查询,返回结果的字段来自不同的表,这种情况我一般是使用Hashtable映射。使用SetResultTransformer(Transformers.AliasToEntityMap)将结果映射成EntityMap,然后调用List<Hashtable>()方法返回查询结果,查询方法返回的结果类型是IList<Hashtable>。
ISQLQuery.SetResultTransformer(Transformers.AliasToEntityMap)
结语
对于复杂的多表联合查询,以及复杂的分组查询,应该使用SQL Query,因为使用它更方便,而且不容易出错。虽然在效率上,比使用其他的方式要略低。但是前提是项目只打算用SQL Server数据库或只用Oracle数据库,因为是使用的原生SQL语句,而SQL Server数据库和Oracle数据库在写查询的时候还是有很多语法上的差别。
NHibernate系列文章二十六:NHibernate查询之SQL Query查询(附程序下载)的更多相关文章
- NHibernate系列文章二十:NHibernate关系之一对一(附程序下载)
摘要 NHibernate一对一关系虽然不经常碰到,但是在对于数据库结构优化的时候,经常会碰到一对一关系.比如,产品详细信息比较多的时候,可以把产品详细信息放到另一张表里面,Product主表只记录产 ...
- NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)
摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4. ...
- NHibernate系列文章二十五:NHibernate查询之Query Over查询(附程序下载)
摘要 这一篇文章介绍在NHibernate 3.2里引入的Query Over查询,Query Over查询跟Criteria查询类似.首先创建IQueryOver对象,然后通过调用该对象的API函数 ...
- NHibernate系列文章二十四:NHibernate查询之Linq查询(附程序下载)
摘要 NHibernate从3.0开始支持Linq查询.写Linq to NHibernate查询就跟写.net linq代码一样,非常灵活,可以很容易实现复杂的查询.这篇文章使用Linq to NH ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)
摘要 上一篇文章介绍了Fluent NHibernate基础知识.但是,Fluent NHibernate提供了一种更方便的Mapping方法称为Auto Mapping.只需在代码中定义一些Conv ...
- NHibernate系列文章二十七:NHibernate Mapping之Fluent Mapping基础(附程序下载)
摘要 从这一节起,介绍NHibernate Mapping的内容.前面文章都是使用的NHibernate XML Mapping.NHibernate XML Mapping是NHibernate最早 ...
- NHibernate系列文章二:创建NHibernate工程
摘要 这篇文章介绍了如何创建一个简单的使用NHibernate的控制台应用程序,包括使用NuGet.简单的配置.单表映射.对NHibernate配置文件添加智能提示.使用ISessionFactory ...
- NHibernate系列文章二十一:延迟加载
摘要 NHibernate的延迟加载机制是很重要的内容.通过关系映射将数据库表之间的关系映射成对象之间的关系,如果没有延迟加载机制,从主表的一个对象的查询将直接查询出所有与该对象关联的其他对象,如果关 ...
随机推荐
- yii2-搜索带分页,分页的两种方式
1.文章表关联 <?php //...other code //关联 public function getCate(){ return $this->hasOne(ArticleCate ...
- Javascript DOM基础(一)概念
Dom基础概念: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...
- C# 反射遍历对象
在项目中需要遍历各种对象,可以通过如下方法遍历. /// <summary> /// 返回对象字符串 /// </summary> /// <param name=&qu ...
- opencv配置(2.49)
转载自浅墨大神http://blog.csdn.net/poem_qianmo/article/details/19809337 OpenCV2.4.9和2.4.8的配置几乎一样,唯一的区别在下文中的 ...
- mm/kmalloc.c
/* * linux/mm/kmalloc.c * * Copyright (C) 1991, 1992 Linus Torvalds & Roger Wolff. * * Writt ...
- 当pip install不能正确安装的时候,try easy_install
当pip install不能正确安装的时候,try easy_install 重复试了几次pip install -r requirements.txt,都在安装pillow的时候失败了,想找这个枕头 ...
- ✡ leetcode 168. Excel Sheet Column Title 26进制数字 --------- java
Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ...
- lnmp 在nginx中配置相应的错误页面error_page
1. 创建自己的404.html页面 2.更改nginx.conf在http定义区域加入: fastcgi_intercept_errors on; 3.更改nginx.conf(或单独网站配置文件, ...
- 综合使用union和limit区分结果并限制返回结果集的条数
limit , 这里的limit限制了返回的union(合并)后的结果集,
- 原创:cellmap 基站查询 for android
cellmap for android 3.6.8.7.9.8 更新日期:2016年12月30日 特别声明:本软件不能进行手机定位,不能对手机号码定位,谨防被骗. 下载地址: cellmap3.6.8 ...