找回密码
 立即注册
首页 业界区 业界 NHibernate拾贝1902:示例查询(Query By Example) ...

NHibernate拾贝1902:示例查询(Query By Example)

康器 2025-5-29 15:00:43
本节内容
           
  • 概览       
  • 实例       
  • 参考资料
概览

这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例子也可以适当的在项目中呈现。
这次看看示例查询(Query By Example) 。按示例查询 (QBE) 搜索机制使用现有对象在数据库中搜索相匹配的对象。
实例

在NHibernate之旅系列文章导航中,我仅是简单介绍了按示例查询使用,没有过多深入,下面结合几个场景整理下。
1.Domain

首先按照DDD思想,先创建一Domain,这里使用组件和嵌套子组件。
  1. public class Componentizable
  2. {
  3.     public Componentizable(){}
  4.     public Componentizable(string name, string subName, string subName1)
  5.     {
  6.         Component = new Component
  7.                         {
  8.                             Name = name,
  9.                             SubComponent = new SubComponent
  10.                                                {
  11.                                                    SubName = subName,
  12.                                                    SubName1 = subName1
  13.                                                }
  14.                         };
  15.     }
  16.     public virtual int Id { get; set; }
  17.     public virtual Component Component { get; set; }
  18.     public virtual string NickName { get; set; }
  19. }
  20. public class Component
  21. {
  22.     public virtual string Name { get; set; }
  23.     public virtual SubComponent SubComponent { get; set; }
  24. }
  25. public class SubComponent
  26. {
  27.     public virtual string SubName { get; set; }
  28.     public virtual string SubName1 { get; set; }
  29. }
复制代码
2.Mapping

映射这个Domain:
  1. <class name="Componentizable">
  2.     <id name="Id">
  3.         <generator class="native"/>
  4.     </id>
  5.     <property name="NickName"/>
  6.     <component name="Component" access="property" class="Component">
  7.         <property name="Name"/>
  8.         <component name="SubComponent" class="SubComponent">
  9.             <property name="SubName"/>
  10.             <property name="SubName1"/>
  11.         </component>
  12.     </component>
  13. </class>
复制代码
3.Test

先创建三个实例:
  1. var master1 = new Componentizable("nhibernate", "ORM tool", "ORM tool1");
  2. var master2 = new Componentizable("nhibernate", "open source", "open source1");
  3. var master3 = new Componentizable("nhibernate", null, null);
复制代码
测试1:按照传入的对象,启用Like模糊匹配查询数据库相似的数据。
  1. //传入一个Domain实例
  2. var master = new Componentizable("nhibernate", null, "ope%");
  3. //按照这个Domain实例匹配查询数据库
  4. var result = s.CreateCriteria<Componentizable>()
  5.     .Add(Example.Create(master).EnableLike())
  6.     .List<Componentizable>();
复制代码
看看SQL生成,使用了like关键字。查询出1笔记录
1.jpeg

测试2:按照传入的对象,启用Like模糊前匹配查询数据库相似的数据。
  1. //传入一个Domain实例
  2. var master = new Componentizable("nhib", null, "open source1");
  3. //按照这个Domain实例匹配查询数据库
  4. var result = s.CreateCriteria<Componentizable>()
  5.     .Add(Example.Create(master).EnableLike(MatchMode.Start))
  6.     .List<Componentizable>();
复制代码
(一条记录)
2.jpeg

测试3:看看后匹配
  1. var master =new Componentizable("nate", null, "ORM tool1");
  2. //按照这个Domain实例匹配查询数据库
  3. var result = s.CreateCriteria<Componentizable>()
  4.     .Add(Example.Create(master).EnableLike(MatchMode.End))
  5.     .List<Componentizable>();
复制代码
(一条记录)
3.jpeg

测试4:全匹配
  1. var master = new Componentizable("bern", null, null);
  2. var result = s.CreateCriteria<Componentizable>()
  3.     .Add(Example.Create(master).EnableLike(MatchMode.Anywhere))
  4.     .List<Componentizable>();
复制代码
(三条记录)
4.jpeg

测试5:查询不匹配的数据
  1. var master = new Componentizable("nhibernate", null, "ope%");
  2. var result = s.CreateCriteria<Componentizable>()
  3.     .Add(Restrictions.Or(
  4.                Restrictions.Not(Example.Create(master).EnableLike()),
  5.                Example.Create(master).EnableLike()))
  6.     .List<Componentizable>();
复制代码
(两条记录)
5.jpeg

测试6:查询匹配示例,但是某些属性除外,这里排除组件。
  1. var master = new Componentizable("nhibernate", null, "ope%");
  2. var result = s.CreateCriteria<Componentizable>()
  3.     .Add(Example.Create(master).EnableLike()
  4.     .ExcludeProperty("Component.SubComponent"))
  5.     .List<Componentizable>();
复制代码
(三条记录)
6.jpeg

测试7:查询匹配示例,但是某个属性除外
  1. var master2 = new Componentizable("nhibernate", "ORM tool", "fake stuff");
  2. var result2 = s.CreateCriteria<Componentizable>()
  3.     .Add(Example.Create(master2).EnableLike()
  4.     .ExcludeProperty("Component.SubComponent.SubName1"))
  5.     .List<Componentizable>();
复制代码
(一条记录)
7.jpeg

那么按照示例查询到底用在什么地方呢?想想以下几个场景:
我们知道某个对象的几个属性,并不知道其主键,想获取这个对象。
我们的方法参数使用对象传递。
我们在界面中常常看见的选择器、筛选器。
我们按照对象的某个/些属性匹配搜索,有时我们也不需要匹配一些属性。
等等场景......
参考资料

李永京:NHibernate之旅(8):巧用组件之依赖对象
李永京:NHibernate之旅(4):探索查询之条件查询(Criteria Query)

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册