NHibernate Issues之1902:示例查询(Query By Example)

本节内容

概览

这个系列是以博客形式整理关于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笔记录

NHibernate Issues之1902:示例查询(Query By Example)

测试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>();

(一条记录)

NHibernate Issues之1902:示例查询(Query By Example)

测试3:看看后匹配

var master =new Componentizable("nate", null, "ORM tool1");

//按照这个Domain实例匹配查询数据库

var result = s.CreateCriteria<Componentizable>()

    .Add(Example.Create(master).EnableLike(MatchMode.End))

    .List<Componentizable>();

(一条记录)

NHibernate Issues之1902:示例查询(Query By Example)

测试4:全匹配

var master = new Componentizable("bern", null, null);

var result = s.CreateCriteria<Componentizable>()

    .Add(Example.Create(master).EnableLike(MatchMode.Anywhere))

    .List<Componentizable>();

(三条记录)

NHibernate Issues之1902:示例查询(Query By Example)

测试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>();

(两条记录)

NHibernate Issues之1902:示例查询(Query By Example)

测试6:查询匹配示例,但是某些属性除外,这里排除组件。

var master = new Componentizable("nhibernate", null, "ope%");

var result = s.CreateCriteria<Componentizable>()

    .Add(Example.Create(master).EnableLike()

    .ExcludeProperty("Component.SubComponent"))

    .List<Componentizable>();

(三条记录)

NHibernate Issues之1902:示例查询(Query By Example)

测试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 Issues之1902:示例查询(Query By Example)

那么按照示例查询到底用在什么地方呢?想想以下几个场景:

我们知道某个对象的几个属性,并不知道其主键,想获取这个对象。

我们的方法参数使用对象传递。

我们在界面中常常看见的选择器、筛选器。

我们按照对象的某个/些属性匹配搜索,有时我们也不需要匹配一些属性。

等等场景......

参考资料

李永京:NHibernate之旅(8):巧用组件之依赖对象

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

你可能感兴趣的:(Hibernate)