zoukankan      html  css  js  c++  java
  • NHibernate使用--进阶篇(多表查询)

    在开发的过程中我们总是会碰到多表操作的需求,今天我分享一个关于查询的方法,

    前言:在使用NHibernate中,需要将用户表(Users)、部门表(Departments),链表查询,在网上找了很多资料,可以在配置文件中配置相应的属性达到关联的效果,一对多、多对一、多对多的方式,但是使用后发现有些不便,尤其时刚开始接触NHibernate,有点儿难理解,现在我使用一种新的方法,使用我们最熟悉的SQL来完成相关功能

    1.0 首先我们需要把环境配置好,请参考我前面的随笔,

    2.0 我们在NHibernateSample中定义一个方法

    /// <summary>
            /// 查询所有数据
            /// </summary>
            /// <returns></returns>
            public IList<Object> GetCustomers()
            {
                return Session.CreateSQLQuery("select  A.*,B.* from Users A ,Departments B WHERE A.Dept_id = B.dept_id")
                    .AddEntity(typeof(Users)).AddEntity(typeof(Departments)).List<Object>();
                  
                //return Session.QueryOver<MyDepartments>().List();
            }
    查询方法

      

      正如上图所属我们使用了连表查询, 这个时候查询出来的结果是两张表的公共交集 包含所有的字段,随后我们在后面使用.AddEntity(typeof(Users))NHibernateSample会在编译的时候获取我们传入的类型,随即找到相应的配置文件,根据配置文件相应的配置,就可以将我们的类中的字段和数据库查询结果的字段一一对应 ,然后生成相应的结果集,最后我们输出.List<Object>(); 这样就得到了连表查询的结果,那么我们该怎么样使用它呢?返回出来的结果集又是什么样子的呢?

     

    返回出来的结果集的样子:NHibernateSample将数据库中的一行数据对应到我们给定的实体类对象,因此集合中每一个对象又包含两个对象一个是部门属性/值的集合,另一个是用户属性/值的集合  

    该怎么样使用它 :手动的拼装返回的结果集

    //创建一个操作类对象  这里还记得嘛?我们在NHibernateSample操作类的构造函数中声明了一个ISession的参数 这里我们调用帮助类的GetSession()方法返回一个ISession
                NHibernateSample _sample = new NHibernateSample(new NHibernateHelper().GetSession());
    
    
                //声明一个对象的集合  由于是多对一的关系 所以我在用户类中自定义了一个部门类型的属性字段
                List<Users> list_u = new List<Users>();
    
                //存放数据库返回的查询结果
                IList<Object> list_o = _sample.GetCustomers();
    
                //这里因为返回的是Object类型 所以只能用for循环 不能使用foreach
                for (int i = 0; i < list_o.Count; i++)
                {
                    //获取集合中的对象
                    Object[] isu_d = (Object[])_sample.GetCustomers()[i];
    
                    //将当前对象中的第一个用户属性/值的对象集合插入到U对象中
                    Users u = (Users)isu_d[0];
    
                    //将当前对象中的第二个部门属性/值的对象集合插入到U对象的Departments(相应的部门类型属性 上面提到过的)中
                    u.Departments = (Departments)isu_d[1];
                    //添加到集合中
                    list_u.Add(u);
                }
                //最后返回的就是 用户的集合list_u  在用户中的属性Departments包含了相对应的部门信息
                list_u.Count();
    使用返回的结果集

    结束了---------

  • 相关阅读:
    php-fpm: 某项目网站频繁出现503问题解决( WARNING: [pool www] server reached pm.max_children setting (50), consider raising it)
    spring mvc: rss(xml)输出
    spring mvc: json练习
    spring mvc: xml练习
    spring mvc:输出json,输出多个json
    phalcon: 目录分组后的acl权限控制
    spring mvc: xml生成
    spring mvc:视图解析器
    Python爬虫从入门到放弃(二十)之 Scrapy分布式原理
    Python爬虫从入门到放弃(十九)之 Scrapy爬取所有知乎用户信息(下)
  • 原文地址:https://www.cnblogs.com/huanjinyuan/p/8064672.html
Copyright © 2011-2022 走看看