上篇文章简单介绍NHibernate之简单增删改查,本文将会简单介绍有关执行NHibernate的SQL、HQL及存储过程;

一:执行SQL语句实例,运用CreateSQLQuery方法

        public IList<SchoolModel> GetListBySql()
{
string strSql = "select * from T_School where studentNum>250";
ISQLQuery sqlQuery = isession.CreateSQLQuery(strSql).AddEntity(typeof(SchoolModel));
return sqlQuery.List<SchoolModel>();
}

二:执行存储过程实例

2.1:首先定义一个存储过程,传入一个参数

Create PROCEDURE [dbo].[Pro_Hql]
@StudentNum int
AS
BEGIN
select * from T_School where studentNum>@StudentNum
END

2.2:引入using System.Data;using NHibernate.Engine命名空间,NHibernateHelper是帮助类返回SessionFactory;当然也可以通过它来执行SQL语句

        public IList<SchoolModel> GetListByProcedure()
{
IList<SchoolModel> list = new List<SchoolModel>();
ISessionFactoryImplementor imp = (ISessionFactoryImplementor)new NHibernateHelper().GetSessionFactory();
IDbConnection conn = imp.ConnectionProvider.GetConnection();
IDbCommand cmd = imp.ConnectionProvider.GetConnection().CreateCommand();
try
{
cmd.CommandText = "Pro_Hql";
cmd.CommandType = System.Data.CommandType.StoredProcedure;
IDbDataParameter parameter = cmd.CreateParameter();
parameter.ParameterName = "StudentNum";
parameter.Value = 250;
cmd.Parameters.Add(parameter);
cmd.Connection = conn;
IDataReader read = cmd.ExecuteReader();
while (read.Read())
{
SchoolModel model = new SchoolModel();
model.ID = Guid.Parse(read.GetValue(0).ToString());
model.SchoolName = read.GetValue(1).ToString();
model.BuildDate = DateTime.Parse(read.GetValue(2).ToString());
model.Address = read.GetValue(3).ToString();
model.IsSenior = bool.Parse(read["IsSenior"].ToString());
model.StudentNum = int.Parse(read["StudentNum"].ToString());
list.Add(model);
} }
catch (Exception ex)
{ }
return list;
}

三:执行HQL语句实例,此处用CreateQuery并设置参数用":",当然也可以拼接字符串;

        public IList<SchoolModel> GetListByHql()
{
//实体的名称跟属性大小写都要注意
string hqlStr = "from SchoolModel c where c.StudentNum>:studentNum";
return isession.CreateQuery(hqlStr).SetString("studentNum", "250").List<SchoolModel>();
}

四:Nhibernate也支持Linq的查询功能,其在命名空间NHibernate.Linq;下面列出一些比较常见:

1、限制运算符

Where:筛选序列中的项目
WhereNot:反筛选序列中的项目

2、投影运算符

Select:创建部分序列的投影
SelectMany:创建部分序列的一对多投影

3、分区运算符(分页常用到)

Skip:返回跳过指定数目项目的序列
SkipWhile:返回跳过不满足表达式项目的序列
Take:返回具有指定数目项目的序列
TakeWhile:返回具有满足表达式项目的序列

4、排序运算符

OrderBy:以升序按值排列序列
OrderByDescending:以降序按值排列序列
ThenBy:升序排列已排序的序列
ThenByDescending:降序排列已排序的序列
Reverse:颠倒序列中项目的顺序(用于操作集合)

5、分组运算符

GroupBy:按指定分组方法对序列中的项目进行分组

6、设置运算符

Distinct:返回无重复项目的序列
Except:返回代表两个序列差集的序列(用于操作集合)
Intersect:返回代表两个序列交集的序列(用于操作集合)
Union:返回代表两个序列交集的序列(用于操作集合)

7、转换运算符

Cast:将序列中的元素转换成指定类型
OfType:筛选序列中指定类型的元素
ToArray:从序列返回一个数组
ToDictionary:从序列返回一个字典
ToList:从序列返回一个列表
ToLookup:从序列返回一个查询
ToSequence:返回一个IEnumerable序列

8、元素运算符

DefaultIfEmpty:为空序列创建默认元素(用于操作集合)
ElementAt:返回序列中指定索引的元素(用于操作集合)
ElementAtOrDefault:返回序列中指定索引的元素,或者如果索引超出范围,则返回默认值(用于操作集合)
First:返回序列中的第一个元素
FirstOrDefault:返回序列中的第一个元素,或者如果未找到元素,则返回默认值
Last:返回序列中的最后一个元素(用于操作集合)
LastOrDefault:返回序列中的最后一个元素,或者如果未找到元素,则返回默认值(用于操作集合)
Single:返回序列中的单个元素
SingleOrDefault:返回序列中的单个元素,或者如果未找到元素,则返回默认值

9、生成运算符

Empty:生成一个空序列
Range:生成一个指定范围的序列
Repeat:通过将某个项目重复指定次数来生成一个序列

10、限定符

All:确定序列中的所有项目是否满足某个条件
Any:确定序列中是否有任何项目满足条件
Contains:确定序列是否包含指定项目

11、聚合运算符

Aggregate:对序列执行一个自定义方法
Average:计算数值序列的平均值
Count:返回序列中的项目数(整数)
LongCount:返回序列中的项目数(长型)
Min:查找数字序列中的最小数
Max:查找数字序列中的最大数
Sum:汇总序列中的数字

12、连接运算符

Concat:将两个序列连成一个序列

13、联接运算符

GroupJoin:通过归组将两个序列联接在一起
Join:将两个序列从内部联接起来

        public IList<SchoolModel> GetSchoolList()
{
IList<SchoolModel> list = null;
list = isession.QueryOver<SchoolModel>().List();
return list;
}
public IList<SchoolModel> GetListByLinq()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().Where(m => m.IsSenior).List();
return list;
}
/// <summary>
/// 返回符合条件的第一条记录,当为空是,返回一个各属性为null的对应类型的对象
/// </summary>
/// <returns></returns>
public SchoolModel GetModelByLinq()
{
SchoolModel model = isession.QueryOver<SchoolModel>().WhereNot(m => m.IsSenior).SingleOrDefault();
if (model == null)
{
return null;
}
return model;
}
/// <summary>
/// 相当于WHERE
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListByLindAnd()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().And(m => m.StudentNum > 390).List();
return list;
}
/// <summary>
/// 相当于反WHERE
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListByLindAndNot()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().AndNot(m => m.StudentNum > 400).List();
return list;
}
/// <summary>
/// 增加限制条件
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListByLinqAndRestrictionOn()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().AndRestrictionOn(m => m.SchoolName).IsLike("踏浪", NHibernate.Criterion.MatchMode.Anywhere).List();
return list;
}
/// <summary>
/// 排序 升
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListOrderByAsc()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().OrderBy(m => m.StudentNum).Asc().List();
return list;
}
/// <summary>
/// 排序 降
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListOrderByDesc()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().OrderBy(m => m.StudentNum).Desc().List();
return list;
}
/// <summary>
/// 近回个数
/// </summary>
/// <returns></returns>
public int GetListByLinqCount()
{
return isession.QueryOver<SchoolModel>().RowCount();
}
/// <summary>
/// 这个东西与前面说的AdnRestrictionOn是一样的,也是可以添加条件啥乱七八糟的
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListByWhereRestritionOn()
{
int[] intList=new int[]{390,400};
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().WhereRestrictionOn(m => m.StudentNum).IsIn(intList).List();
return list;
}
/// <summary>
/// 跳过指定数量的记录
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListBySkip()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().Skip(5).List();
return list;
}
/// <summary>
/// 获取指定数量的记录,与Skip配合使用是经常用到的分页效果
/// </summary>
/// <returns></returns>
public IList<SchoolModel> GetListByTake()
{
IList<SchoolModel> list = isession.QueryOver<SchoolModel>().Take(10).List();
return list;
}
/// <summary>
/// 告知NHibernate你想要查询的是什么东西 相当于select StudentNum from T_School
/// </summary>
/// <returns></returns>
public IList<int> GetListBySelect()
{
IList<int> list = isession.QueryOver<SchoolModel>().Select(m => m.StudentNum).List<int>();
return list;
}
/// <summary>
/// Future()与List()的区别在于Future返回的是IEnumerable<>集合,而List()返回的是IList()
/// </summary>
/// <returns></returns>
public IEnumerable<SchoolModel> GetEnumListByFuture()
{
IEnumerable<SchoolModel> list = isession.QueryOver<SchoolModel>().Where(m => m.SchoolName == "踏浪帅").Future();
return list;
}
/// <summary>
/// 返回最大值
/// </summary>
/// <returns></returns>
public int GetByMax()
{
var StudentNumMax = (from m in GetSchoolList() select m.StudentNum).Max();
return (int)StudentNumMax;
}
/// <summary>
/// 返回最小值
/// </summary>
/// <returns></returns>
public int GetBYMin()
{
var StudentNumMin = (from m in GetSchoolList() select m.StudentNum).Min();
return (int)StudentNumMin;
}
/// <summary>
/// 返回平均值
/// </summary>
/// <returns></returns>
public int GetByAverage()
{
var StudentNumAverage = (from m in GetSchoolList() select m.StudentNum).Average();
return (int)StudentNumAverage;
}
/// <summary>
/// 返回所有的和
/// </summary>
/// <returns></returns>
public int GetBySum()
{
var studentNumSum = (from m in GetSchoolList() select m.StudentNum).Sum();
return (int)studentNumSum;
}

感谢您的阅读,坚持每天进步一点点,离成功就更新一步;希望文章对您有所帮助;

转载:http://www.cnblogs.com/wujy/p/3581137.html

NHibernate初学二之简单执行SQL及HQL、Linq的更多相关文章

  1. NHibernate初学一之简单增删改查

    以前有简单了解NHibernate,但因项目一直没有运用所以也没有机会进行一个详细了解:最近利用一点空闲的时间认真学习它:同样希望把学习过程进行简单记录,今天简单写一个针对MSSQL数据库的增删改查的 ...

  2. 用jdbc连接数据库并简单执行SQL语句

    一:版本一.这种存在一个问题就是每执行一次操作都会创建一次Connection链接和且释放一次链接 1:创建pojo对象(OR映射,一个pojo类对应一张数据库表)   package com.yin ...

  3. Nhibernate系列学习之(二) 简单增删改查

    实例中解决方案简单的创建三层架构,符合开发过程中最简单的运用: 1:首先在数据库中创建一个表T_School,脚本如下: USE [TestDb] GO /****** 对象: Table [dbo] ...

  4. NHibernate直接执行SQL进行插入

    有时候,需要用NHibernate直接执行SQL进行数据insert或update. 怎么写呢?简单一点的,可以直接拼凑出来的SQL,这样写: using NHibernate; StringBuil ...

  5. 使用Hive或Impala执行SQL语句,对存储在Elasticsearch中的数据操作(二)

    CSSDesk body { background-color: #2574b0; } /*! zybuluo */ article,aside,details,figcaption,figure,f ...

  6. 如何更简单方便地执行SQL操作?

    现在公司使用mybatis作为DAL层的框架. 使用起来比较简单,使用xml进行SQL的书写,java代码使用接口执行. 但在写一些简单SQL的时候会显得非常繁琐: xml和java分离(设计上为了解 ...

  7. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  8. nhibernate中执行SQL语句

    在有些时候,可能需要直接执行SQL语句.存储过程等,但nhibernate并没有提供一种让我们执行SQL语句的方法,不过可以通过一些间接的方法来实现. 下面给出一个在nhibernate中执行SQL语 ...

  9. 一条简单的 SQL 执行超过 1000ms,纳尼?

    阅读本文大概需要 2.8 分钟. MySQL 对我说 “Too young, too naive!" ▌大概过程 在测试环境 Docker 容器中,在跨进程调用服务的时候,A 应用通过 Du ...

随机推荐

  1. nyoj119 士兵杀敌(三)

    士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进 ...

  2. 游戏开发tips之RTTI(1)

    首先说明标题的含义,怎么感觉就和定义一种语言一样,需要有一个规约呢..... 标题定义如下:游戏开发tip之+内容+(总tips的第几篇) 扩展如下:内容(一,二,三.....) 新手可怜,大神每一句 ...

  3. emWin教程目录汇总

    目录 第一章: 当前主流的小型嵌入式 GUI 第2章 初学 emWin 的准备工作及其快速上手

  4. 基于CSS3自定义发光radiobox单选框

    之前我们分享过一些CSS3和HTML5实现的自定义checkbox和Radiobox,比如纯CSS3美化Checkbox和Radiobox按钮,不仅外观唯美,而且Radiobox选中时还有动画效果.今 ...

  5. 推荐10款纯css3实现的实用按钮

    在2014年的双11即将来临之季,爱编程小编为大家整理10款纯css3实现的按钮.希望这对坚守在前端的码农们有所帮助.亲,如果你有好的资源也可在本文留言,让从事编码的程序员们抱团.工作更轻松. No1 ...

  6. git学习(三):git暂存区

    回顾之前学过的命令: git init // 初始化一个项目 git add // 将文件交给工作区 git commit // 提交修改 查看提交日志: git log // 查看提交日志 git ...

  7. 关于trunk、access以及hybrid的一些简单知识

    关于trunk.access以及hybrid的一些简单知识:Access 类型的端口只能属于 1 个 VLAN ,一般用于连接计算机的端口: Trunk 类型的端口可以允许多个 VLAN 通过,可以接 ...

  8. iOS边练边学--UIScrollView的属性简单使用,代理的简单介绍以及内容缩放

    一.什么是UIScrollView *移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也是相当有限 *当展示的内容较多,超出一个屏幕时,用户可通过滚动收拾来查看屏幕以外的内容 *普通的UI ...

  9. Intellij IDEA 部署 项目在tomcat 原理

    https://www.zhihu.com/question/54757013 Intellij IDEA通过tomcat部署web项目的机制 IntelliJ IDEA通过Tomcat启动项目过程分 ...

  10. 分布式下的session处理方式

    分布式下的session处理方式 现在的企业级别开发下,分布式的问题是随处可见.今天我们来看看分布式情况下session的处理. 目前的处理方式有以下几种: 1.session黏性.就是说,用户在访问 ...