NHibernate之旅(4):探索查询之条件查询(Criteria Query)

本节内容

  • NHibernate中的查询方法
  • 条件查询(Criteria Query)
    • 1.创建ICriteria实例
    • 2.结果集限制
    • 3.结果集排序
    • 4.一些说明
  • 根据示例查询(Query By Example)
  • 实例分析
  • 结语

上一节,我们介绍了NHibernate查询语言的一种:NHibernate查询语言(HQL,NHibernate Query Language),这一节介绍一下条件查询(Criteria API)。

NHibernate中的查询方法

在NHibernate中提供了三种查询方式给我们选择:NHibernate查询语言(HQL,NHibernate Query Language)、条件查询(Criteria API,Criteria Query)、(根据示例查询(QBE,Query By Example)是条件查询的一种特殊情况)、原生SQL(Literal SQL,T-SQL、PL/SQL)。每个人有不同的喜好和特长,可以根据自己的情况选择使用其中的一种或几种。这一节我们介绍条件查询。

条件查询(Criteria Query)

HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而不是在.NET代码中嵌入字符串。在NHibernate中,提供了一种直观的、可扩展的Criteria API。在我们键入查询语句的时候,提供了编译时的语法检查,VS提供了强大的智能提示。如果你对HQL的语法感觉不是很舒服的话,用这种方法可能更容易。这种API也比HQL更可扩展。

典型用法:从ISession接口中创建ICriteria实例对象;在这个ICriteria实例对象上设置一个或多个表达式;要求ICriteria接口返回需要的列表,就是根据表达式从数据库中返回对象。

注意:由于篇幅有限,我在这里仅仅贴出了数据访问层的代码。测试这些方法的代码就没有贴出来了,你可以下载本系列的源代码仔细看看测试这些方法的代码。这些实例我争取写出来可以运行起来,大家下载源码看看效果,一些数据需要按个人数据库里的数据情况修改。例如查询条件和结果。这节,我们在上一节源代码的基础上,在数据访问层中新建QueryCriteriaAPI.cs类用于编写条件查询方法,在数据访问的测试层新建一QueryCriteriaAPIFixture.cs类用于测试。

1.创建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;
}

例如上面的例子返回Customer对象集合,设置最大的集合数量为50条。

2.结果集限制

使用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;
}

3.结果集排序

使用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>();
}

4.一些说明

条件查询同样支持关联查询、动态关联抓取(在介绍一对多,多对多关系中阐述),投影、聚合和分组,离线(detached)查询和子查询是2.0版新增加的内容,以后在相关知识中介绍。也可以自行参考NHibernate参考文档13章。

根据示例查询(Query By Example)

根据示例查询(QBE,Query By Example)是条件查询的一种特殊情况,NHibernate.Criterion.Example类根据你指定的实例创造查询条件。其典型的用法:创建一个Example实例;在Example实例上设置值;根据Example和设置NHibernate返回其对象集合。

例如下面的例子,按照指定Customer查询数据库里的记录:

public IList<Customer> Query()
{Customer customerSample = new Customer() { Firstname = "YJing", Lastname = "Lee" };return _session.CreateCriteria(typeof(Customer)).Add(Example.Create(customerSample)).List<Customer>();
}

你可以自行调整Example使之更实用:

public IList<Customer> UseQueryByExample_GetCustomer(Customer customerSample)
{Example example = Example.Create(customerSample).IgnoreCase().EnableLike().SetEscapeCharacter('&');return _session.CreateCriteria(typeof(Customer)).Add(example).List<Customer>();
}

实例分析

实例1:利用CriteriaAPI按Firstname和Lastname查询顾客。

public IList<Customer> GetCustomersByFirstnameAndLastname(string firstname, string lastname)
{return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Eq("Firstname", firstname)).Add(Restrictions.Eq("Lastname", lastname)).List<Customer>();
}

测试:调用GetCustomersByFirstnameAndLastname方法,查询Firstname为“YJing",Lastname为"Lee"的顾客,判断查询结果数量是否为1。(注:在数据库中有符合这一个记录)

[Test]
public void GetCustomerByFirstnameAndLastnameTest()
{IList<Customer> customers = _queryCriteriaAPI.GetCustomersByFirstnameAndLastname("YJing", "Lee");Assert.AreEqual(1, customers.Count);
}

实例2:利用CriteriaAPI获取顾客ID大于CustomerId的顾客。

public IList<Customer> GetCutomersWithIdGreaterThan(int customerId)
{return _session.CreateCriteria(typeof(Customer)).Add(Restrictions.Gt("CustomerId", customerId)).List<Customer>();
}

结语

好了,通过2篇文章的介绍,对NHibernate中的查询语法有了大致了解,知道了NHibernate中两种最主要的查询方式,还有一种原生SQL查询,内容不多,请参考NHibernate官方文档吧。多多练习!下节将介绍对对象的操作。

本系列链接:NHibernate之旅系列文章导航

NHibernate Q&A
  • 欢迎加入NHibernate中文社区,一起讨论NHibernate知识!
  • 请到NHibernate中文社区下载本系列相关源码。

下次继续分享NHibernate!

转载于:https://www.cnblogs.com/lyj/archive/2008/10/16/1312906.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476475.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 205. 同构字符串(哈希map)

1. 题目 给定两个字符串 s 和 t&#xff0c;判断它们是否是同构的。 如果 s 中的字符可以被替换得到 t &#xff0c;那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换&#xff0c;同时保留字符的顺序。 两个字符不能映射到同一个字符上&#xff0c;但字符可…

soapui返回值类型都有哪些_法兰的类型都有哪些以及法兰的设计

法兰的类型都有哪些呢&#xff1f;1. 压力容器的法兰可以按照法兰总体的结构&#xff0c;分为一般法兰还有反向法兰。2 .按照法兰垫片布置的类型来说&#xff0c;我们可以分为窄面法兰还有宽面法兰两个大类。a.窄面法兰指的是垫片的接触面&#xff0c;位于法兰螺栓孔所包围的圆…

别等ChatGPT开源了,升级版OPT开源模型来了!

源&#xff5c;新智元编&#xff5c;Joey 昕朋今年五月&#xff0c;MetaAI官宣发布了基于1750亿参数的超大模型OPT-175B&#xff0c;还对所有社区免费开放。12月22日&#xff0c;该模型的更新版本OPT-IML&#xff08;Open Pre-trained Transformer&#xff09;正式上线&#xf…

浅谈“三层结构”原理与用意(转帖)

浅谈“三层结构”原理与用意 序 在刚刚步入“多层结构”Web应用程序开发的时候&#xff0c;我阅读过几篇关于“asp.net三层结构开发”的文章。但其多半都是对PetShop3.0和Duwamish7的局部剖析或者是学习笔记。对“三层结构”通体分析的学术文章几乎没有。 2005年2月11日&#…

python bottle支持https_python bottle 简介

bottle是一个轻量级的pythonweb框架&#xff0c; 可以适配各种web服务器&#xff0c;包括python自带的wsgiref(默认)&#xff0c;gevent&#xff0c; cherrypy&#xff0c;gunicorn等等。bottle是单文件形式发布&#xff0c;源码在这里可以下载&#xff0c;代码量不多&#xff…

NVIDIA重磅发布NVAIE 3.0,AI时代的操作系统来了

文&#xff5c;卖萌酱近年来&#xff0c;AI技术发展迅速&#xff0c;随着以Pytorch、TensorFlow为代表的深度学习框架的成熟&#xff0c;AI模型的训练流程已经变得相对清晰、成熟。然而&#xff0c;预训练模型和后续一系列超大模型的出现&#xff0c;使得对于大部分AI开发者和企…

python序列符号_Python中的文本和字节序列

导语&#xff1a;本文章记录了本人在学习Python基础之数据结构篇的重点知识及个人心得&#xff0c;打算入门Python的朋友们可以来一起学习并交流。本章重点&#xff1a;1、了解字符字节等概念&#xff0c;编解码问题&#xff1b;2、熟悉字符的规范化处理和双模式API。一、基本概…

LeetCode 258. 各位相加

1. 题目 给定一个非负整数 num&#xff0c;反复将各个位上的数字相加&#xff0c;直到结果为一位数。 示例: 输入: 38 输出: 2 解释: 各位相加的过程为&#xff1a;3 8 11, 1 1 2。 由于 2 是一位数&#xff0c;所以返回 2。 进阶: 你可以不使用循环或者递归&#xff0…

读取 Radio 的值

读取 Radio 的值 2 <form id"form1"action""method"">3 <div><input type"radio"name"r"id"r1"value"一"><label for"r1">选项一</label></div>4 <d…

够快,首个“开源ChatGPT项目“来了!网友吐槽:这谁能跑

文&#xff5c;明敏 源&#xff5c;量子位就说程序员的手速有多快吧&#xff0c;首个开源ChatGPT项目已经出现了&#xff01;基于谷歌语言大模型PaLM架构&#xff0c;以及使用从人类反馈中强化学习的方法&#xff08;RLHF&#xff09;&#xff0c;华人小哥Phillip Wang复刻了一…

linux 串口工具_会C++就能开发Linux/Android应用!这款Yoxios X3串口屏火了...

大家好&#xff0c;我是小月月。今天给大家介绍一款搭载YOXIOS操作系统的YOXIOS X3串口屏&#xff0c;只要你会C/C就能开发Linux/Android应用&#xff01;而且小月月带来了福利——“免费试用名额”&#xff01;&#xff01;YOXIOS X3介绍YOXIOS X3串口屏比传统串口屏要强大得多…

LeetCode 278. 第一个错误的版本(二分查找)

1. 题目 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。 不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。 由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff0c;…

LeetCode 284. 顶端迭代器

1. 题目 给定一个迭代器类的接口&#xff0c;接口包含两个方法&#xff1a; next() 和 hasNext()。 设计并实现一个支持 peek() 操作的顶端迭代器 – 其本质就是把原本应由 next() 方法返回的元素 peek() 出来。 示例: 假设迭代器被初始化为列表 [1,2,3]。调用 next() 返回 1…

ChatGPT国内镜像站

ChatGPT介绍 ChatGPT是OpenAI开发的一个大型预训练语言模型。它是GPT-3模型的变体&#xff0c;GPT-3经过训练&#xff0c;可以在对话中生成类似人类的文本响应。ChatGPT 旨在用作聊天机器人&#xff0c;我们可以对其进行微调&#xff0c;以完成各种任务&#xff0c;如回答问题…

【转】DATAGRIDVIEW控制

目录&#xff1a; 取得或者修改当前单元格的内容 设定单元格只读 不显示最下面的新行 判断新增行 行的用户删除操作的自定义 行、列的隐藏和删除 禁止列或者行的Resize ★ DataGridView 取得或者修改当前单元格的内容&#xff1a; GO TO TOP 当前单元格指的是 DataGridView…

matlab 动画_MATLAB绘图动画(1)

今天写一个案列&#xff0c;绘图动画画出以下曲面函数随着theta角的变化的动图程序代码&#xff1a;clc,clear,close allx-8:0.5:8;[X,Y]meshgrid(x);rsqrt(X.^2Y.^2);Zsin(r)./r;figure(color,w);surf(Z); %画出帧theAxes axis; %保存…

LeetCode 2020 力扣杯全国春季编程大赛(1644/4093,前40.2%)

文章目录1. 比赛结果2. 题目解析2.1 拿硬币 Easy2.2 传递信息 Esay2.3 剧情触发时间 Medium2.4 最小跳跃次数 Hard2.5 二叉树任务调度 Hard1. 比赛结果 前两题比较顺利&#xff0c;24分钟做出来了&#xff0c;第3&#xff0c;4两题试了好久&#xff0c;都显示超时&#xff0c;…

silverlight2.0 demo实例,源码下载

这是最近发现的微软官方网站上提供的学习例子&#xff0c;并有源码下载&#xff0c;与大家分享。 http://silverlight.net/Community/gallerydetail.aspx?catsl2 下面这个链接是银光开源中心提供的&#xff0c;也不错哦。。 http://www.slcenter.cn/ YoLing音频播放器v1.0 for…

网页设计框架布局代码_网页设计中的分屏切割布局法

今天和大家聊的是一种关于网页设计中的视觉呈现方法&#xff0c;一般我们称之为“分屏布局”&#xff0c;是一种常见的网页设计排版方式&#xff0c;将页面分割为均等或者不均等的两部分&#xff0c;这种方式的好处就是可以将文字信息和图像元素进行更有效的布局区分&#xff0…

LeetCode 第 24 场双周赛(326/1898,前17.2%)

文章目录1. 比赛结果2. 题目1. LeetCode 5372. 逐步求和得到正数的最小值 easy2. LeetCode 5373. 和为 K 的最少斐波那契数字数目 medium3. LeetCode 5374. 长度为 n 的开心字符串中字典序第 k 小的字符串 medium4. LeetCode 5375. 恢复数组 hard1. 比赛结果 做出来了 1、2、3…