NHibernate 1902问题:如何实现示例查询(Query By Example)示例?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1317个文字,预计阅读时间需要6分钟。
本节内容涵盖概述、概览、实例、参考资料、概览,该系列以博客形式整理了关于Hibernate Issues的相关内容。记录了一些零散的小例子,通过这些零散的整理,可以巩固自己的知识,并扩展我们的知识面。以下是一些小例子:
1. 实例:在使用Hibernate进行持久化时,遇到了一个关于对象状态不一致的问题。通过分析日志,发现是由于事务提交时未正确关闭Session导致的。
2.实例:在映射实体时,发现某个字段的值在数据库中为NULL,但在实体中却为非NULL。经过检查,发现是字段映射时使用了错误的类型。
3.实例:在执行批量更新操作时,遇到了性能瓶颈。通过分析SQL语句,发现是因为使用了不合适的索引。
参考资料:
- Hibernate官方文档- Hibernate社区论坛- 《Hibernate实战》概览:这个系列旨在通过一系列关于Hibernate Issues的小例子,帮助读者更好地理解和解决在使用Hibernate过程中遇到的问题。通过这些实例的整理,可以提升读者对Hibernate的理解和运用能力。
本节内容
- 概览
- 实例
- 参考资料
这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例子也可以适当的在项目中呈现。
这次看看示例查询(Query By Example) 。按示例查询 (QBE) 搜索机制使用现有对象在数据库中搜索相匹配的对象。
实例在NHibernate之旅系列文章导航中,我仅是简单介绍了按示例查询使用,没有过多深入,下面结合几个场景整理下。
1.Domain首先按照DDD思想,先创建一Domain,这里使用组件和嵌套子组件。
public class Componentizable { public Componentizable(){} public Componentizable(string name, string subName, string subName1) { Component = new Component { Name = name, SubComponent = new SubComponent { SubName = subName, SubName1 = subName1 } }; } public virtual int Id { get; set; } public virtual Component Component { get; set; } public virtual string NickName { get; set; } } public class Component { public virtual string Name { get; set; } public virtual SubComponent SubComponent { get; set; } } public class SubComponent { public virtual string SubName { get; set; } public virtual string SubName1 { get; set; } } 2.Mapping
映射这个Domain:
<class name="Componentizable"> <id name="Id"> <generator class="native"/> </id> <property name="NickName"/> <component name="Component" access="property" class="Component"> <property name="Name"/> <component name="SubComponent" class="SubComponent"> <property name="SubName"/> <property name="SubName1"/> </component> </component> </class> 3.Test
先创建三个实例:
var master1 = new Componentizable("nhibernate", "ORM tool", "ORM tool1"); var master2 = new Componentizable("nhibernate", "open source", "open source1"); var master3 = new Componentizable("nhibernate", null, null); 测试1:按照传入的对象,启用Like模糊匹配查询数据库相似的数据。
//传入一个Domain实例 var master = new Componentizable("nhibernate", null, "ope%"); //按照这个Domain实例匹配查询数据库 var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike()) .List<Componentizable>();
看看SQL生成,使用了like关键字。查询出1笔记录
测试2:按照传入的对象,启用Like模糊前匹配查询数据库相似的数据。//传入一个Domain实例 var master = new Componentizable("nhib", null, "open source1"); //按照这个Domain实例匹配查询数据库 var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike(MatchMode.Start)) .List<Componentizable>();
(一条记录)
测试3:看看后匹配var master =new Componentizable("nate", null, "ORM tool1"); //按照这个Domain实例匹配查询数据库 var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike(MatchMode.End)) .List<Componentizable>();
(一条记录)
测试4:全匹配var master = new Componentizable("bern", null, null); var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike(MatchMode.Anywhere)) .List<Componentizable>();
(三条记录)
测试5:查询不匹配的数据var master = new Componentizable("nhibernate", null, "ope%"); var result = s.CreateCriteria<Componentizable>() .Add(Restrictions.Or( Restrictions.Not(Example.Create(master).EnableLike()), Example.Create(master).EnableLike())) .List<Componentizable>();
(两条记录)
测试6:查询匹配示例,但是某些属性除外,这里排除组件。var master = new Componentizable("nhibernate", null, "ope%"); var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike() .ExcludeProperty("Component.SubComponent")) .List<Componentizable>();
(三条记录)
测试7:查询匹配示例,但是某个属性除外var master2 = new Componentizable("nhibernate", "ORM tool", "fake stuff"); var result2 = s.CreateCriteria<Componentizable>() .Add(Example.Create(master2).EnableLike() .ExcludeProperty("Component.SubComponent.SubName1")) .List<Componentizable>();
(一条记录)
那么按照示例查询到底用在什么地方呢?想想以下几个场景:
我们知道某个对象的几个属性,并不知道其主键,想获取这个对象。
我们的方法参数使用对象传递。
我们在界面中常常看见的选择器、筛选器。
我们按照对象的某个/些属性匹配搜索,有时我们也不需要匹配一些属性。
等等场景......
参考资料李永京:NHibernate之旅(8):巧用组件之依赖对象
李永京:NHibernate之旅(4):探索查询之条件查询(Criteria Query)
本文共计1317个文字,预计阅读时间需要6分钟。
本节内容涵盖概述、概览、实例、参考资料、概览,该系列以博客形式整理了关于Hibernate Issues的相关内容。记录了一些零散的小例子,通过这些零散的整理,可以巩固自己的知识,并扩展我们的知识面。以下是一些小例子:
1. 实例:在使用Hibernate进行持久化时,遇到了一个关于对象状态不一致的问题。通过分析日志,发现是由于事务提交时未正确关闭Session导致的。
2.实例:在映射实体时,发现某个字段的值在数据库中为NULL,但在实体中却为非NULL。经过检查,发现是字段映射时使用了错误的类型。
3.实例:在执行批量更新操作时,遇到了性能瓶颈。通过分析SQL语句,发现是因为使用了不合适的索引。
参考资料:
- Hibernate官方文档- Hibernate社区论坛- 《Hibernate实战》概览:这个系列旨在通过一系列关于Hibernate Issues的小例子,帮助读者更好地理解和解决在使用Hibernate过程中遇到的问题。通过这些实例的整理,可以提升读者对Hibernate的理解和运用能力。
本节内容
- 概览
- 实例
- 参考资料
这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例子也可以适当的在项目中呈现。
这次看看示例查询(Query By Example) 。按示例查询 (QBE) 搜索机制使用现有对象在数据库中搜索相匹配的对象。
实例在NHibernate之旅系列文章导航中,我仅是简单介绍了按示例查询使用,没有过多深入,下面结合几个场景整理下。
1.Domain首先按照DDD思想,先创建一Domain,这里使用组件和嵌套子组件。
public class Componentizable { public Componentizable(){} public Componentizable(string name, string subName, string subName1) { Component = new Component { Name = name, SubComponent = new SubComponent { SubName = subName, SubName1 = subName1 } }; } public virtual int Id { get; set; } public virtual Component Component { get; set; } public virtual string NickName { get; set; } } public class Component { public virtual string Name { get; set; } public virtual SubComponent SubComponent { get; set; } } public class SubComponent { public virtual string SubName { get; set; } public virtual string SubName1 { get; set; } } 2.Mapping
映射这个Domain:
<class name="Componentizable"> <id name="Id"> <generator class="native"/> </id> <property name="NickName"/> <component name="Component" access="property" class="Component"> <property name="Name"/> <component name="SubComponent" class="SubComponent"> <property name="SubName"/> <property name="SubName1"/> </component> </component> </class> 3.Test
先创建三个实例:
var master1 = new Componentizable("nhibernate", "ORM tool", "ORM tool1"); var master2 = new Componentizable("nhibernate", "open source", "open source1"); var master3 = new Componentizable("nhibernate", null, null); 测试1:按照传入的对象,启用Like模糊匹配查询数据库相似的数据。
//传入一个Domain实例 var master = new Componentizable("nhibernate", null, "ope%"); //按照这个Domain实例匹配查询数据库 var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike()) .List<Componentizable>();
看看SQL生成,使用了like关键字。查询出1笔记录
测试2:按照传入的对象,启用Like模糊前匹配查询数据库相似的数据。//传入一个Domain实例 var master = new Componentizable("nhib", null, "open source1"); //按照这个Domain实例匹配查询数据库 var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike(MatchMode.Start)) .List<Componentizable>();
(一条记录)
测试3:看看后匹配var master =new Componentizable("nate", null, "ORM tool1"); //按照这个Domain实例匹配查询数据库 var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike(MatchMode.End)) .List<Componentizable>();
(一条记录)
测试4:全匹配var master = new Componentizable("bern", null, null); var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike(MatchMode.Anywhere)) .List<Componentizable>();
(三条记录)
测试5:查询不匹配的数据var master = new Componentizable("nhibernate", null, "ope%"); var result = s.CreateCriteria<Componentizable>() .Add(Restrictions.Or( Restrictions.Not(Example.Create(master).EnableLike()), Example.Create(master).EnableLike())) .List<Componentizable>();
(两条记录)
测试6:查询匹配示例,但是某些属性除外,这里排除组件。var master = new Componentizable("nhibernate", null, "ope%"); var result = s.CreateCriteria<Componentizable>() .Add(Example.Create(master).EnableLike() .ExcludeProperty("Component.SubComponent")) .List<Componentizable>();
(三条记录)
测试7:查询匹配示例,但是某个属性除外var master2 = new Componentizable("nhibernate", "ORM tool", "fake stuff"); var result2 = s.CreateCriteria<Componentizable>() .Add(Example.Create(master2).EnableLike() .ExcludeProperty("Component.SubComponent.SubName1")) .List<Componentizable>();
(一条记录)
那么按照示例查询到底用在什么地方呢?想想以下几个场景:
我们知道某个对象的几个属性,并不知道其主键,想获取这个对象。
我们的方法参数使用对象传递。
我们在界面中常常看见的选择器、筛选器。
我们按照对象的某个/些属性匹配搜索,有时我们也不需要匹配一些属性。
等等场景......
参考资料李永京:NHibernate之旅(8):巧用组件之依赖对象
李永京:NHibernate之旅(4):探索查询之条件查询(Criteria Query)

