Nhibernate多表查询解决办法

概述:

在项目中应用NHibernate架构时,会经常遇到多表查询.因为项目上要用到,通过多天的查询总结了以下 两种解决方案.

解决方案:

(1)使用HQL语句,然后把查询出的结果存入临时表中,然后再进行绑定.

(2)使用select new OaxtJoinGlxt这种语法,根据查询的内容自己构建相应的实体类.

第一种方案实现具体过程:

我的需求如下:

我需要查询JkptOaxtOrganization实体类中的Orgid,及JkptGlxtOrganization实体类中的Orgname我需 要查询JkptOaxtOrganization实体类中的Orgid,及JkptGlxtOrganization实体类中的Orgname

第一步:构建HQL语句如下

  string sql = "select oo.Orgid ,go.Orgname from JkptOaxtOrganization as  oo,JkptGlxtOrganization as go where oo.Orgid="+orgid+" and  oo.Suborgid=go.Orgid";
                IQuery Query = session.CreateQuery(sql);
 IList list = Query.List();

说明:如果在相应的映射文件中设置好实体的对应关系,就没有必要加Where条件了.

第二步:建立临时表,把查询出的结果存入临时表

DataTable dt = new DataTable();
                DataColumn dc = new DataColumn();

                dc = new DataColumn(); //增加第1列
                dc.DataType = System.Type.GetType("System.Int32");
                dc.ColumnName = "Orgid";
                dt.Columns.Add(dc);

                dc = new DataColumn();  //增加第2列
                dc.DataType = System.Type.GetType("System.String");
                dc.ColumnName = "Orgname";
                dt.Columns.Add(dc);
                dc.Dispose();

                IEnumerator enu = list.GetEnumerator();
                while (enu.MoveNext())
                {     //给查询出来的每行赋值
                    object[] obj = (object[])enu.Current;
                    DataRow newrow = dt.NewRow();
                    newrow["Orgid"] = obj[0];
                    newrow["Orgname"] = obj[1];
                    dt.Rows.Add(newrow);
                }

                ds.Tables.Add(dt);

我个人觉得,这种方式存在很大缺陷,如临时表用完需要删除,如果要查询50个字段,那么写临时表就得 累死,所以我还是推荐大家用第二种方案.

时间: 2025-01-25 09:08:22

Nhibernate多表查询解决办法的相关文章

sql语句 大量占用内存的查询解决办法

解决办法:     A.优化语句,创建/使用合适的索引:     B.解决第一个问题的方法,更新要查询表的索引分发统计,保证估计时间的正确性,UPDATE  STATISTICS 表名:     C.增加内存.     如果想手动设置查询超时,可以使用以下语句:  代码如下 复制代码 sp_configure 'show advanced options', 1 GO RECONFIGURE GO sp_configure 'query wait', 2147483647 GO RECONFIG

电脑安装软件时无法将注册值写入注册表的解决办法

  有个网友安装程序时,弹出窗口,提示无法将注册值写入注册表,结果安装了好几遍,都无法成功,只好百度求助,他把出问题时的提示图片传上来,希望得到帮助.这样的问题一般都是注册表被禁了,或者说用户缺少注册表修改权限所致,所以才安装不了程序,给他提供的解决方法如下, 步骤一:解禁组策略 1,要解禁组策略,当然先得进入,进入方法,在开始菜单中,打开运行程序,然后在打开的运行框中输入gpedit.msc命令,确定. 2,进入组策略后,先在左侧目录中找到"用户配置"这一项,然打开它的子项,找到其中

打不开win7系统注册表的解决办法

  1.按组合键(win+R)打开运行窗口,在命令框中输入"gpedit.msc",回车确认,如下图所示: 2.打开本地组策略编辑器界面后,我们依次点击展开"用户配置-管理模板-系统",然后在右边设置列表中找到并双击"阻止访问注册表编辑工具"项,如下图所示: 3.在随后弹出的设置窗口中,我们只需单击选择"未配置",然后点击"确定"按钮即可,如下图所示: 完成上述设置后,当我们再次尝试打开注册表会发现已经可以

sql server 2008 不允许保存更改,您所做的更改要求删除并重新创建以下表 的解决办法

启动SQL Server 2008 Management Studio 工具菜单----选项----Designers(设计器)----阻止保存要求重新创建表的更改  取消勾选即可. KidYang

nhibernate-Nhibernate多表查询,不用遍历填充每一个值

问题描述 Nhibernate多表查询,不用遍历填充每一个值 有一个person类,里面有个status字段,保存的是人员状态.类型为int 还有一个baseinfo类,里面有name字段,用来保存status的中文如:在职/离职,还有一个value字段,与person类里面的status字段相对应,类型为int 这样做的目的是能够把一些基础数据进行维护. 我的问题是:用nhibernate查询后,如果返回person的List,如何将baseinfo中name字段的值,附加到List中每一个p

MySQL SQL UPDATE语句出现#1093错误解决办法

我使用了这样一个SQL:  代码如下 复制代码 UPDATE `student_quiz_answer` SET `article_id`= (SELECT qa.article_id, sqa.answer_id FROM student_quiz_answer sqa LEFT JOIN `quiz_answer` qa ON sqa.answer_id = qa.answer_id where qa.article_id > 0) 问题来自MySQL更新Table某个字段时,如果 Upda

Font Capture:AcrobatInfo.exe 应用程序错误的解决办法

Font Capture:AcrobatInfo.exe 错误,AcrobatInfo.exe 错误,Font Capture错误的最简单的解决办法,终极解决方案. 出 现这个错误的朋友大部分都是安装Adobe Acrobat 9 Pro之后才会出现的,而且不一定要打开使用Adobe Acrobat 9 Pro,在使用电脑,打开浏览器等多种时候都会提示这个"Font Capture:AcrobatInfo.exe应用程序错误的内存错误",很严重,经常会弹出这个错误. 最简单的解决办法:

MYSQL启动失败多种原因总结与解决办法

问题一 111217 23:23:57  InnoDB: Database was not shut down normally! InnoDB: Starting crash recovery. InnoDB: Reading tablespace information from the .ibd files- InnoDB: Restoring possible half-written data pages from the doublewrite InnoDB: buffer- Inn

忘记Mysql密码的解决办法小结_Mysql

方法1: 用SET PASSWORD命令 mysql -u root mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass'); 方法2:用mysqladmin mysqladmin -u root password "newpass" 如果root已经设置过密码,采用如下方法 mysqladmin -u root password oldpass "newpass" 方法3: 用UPDA