概述:
在項目中應用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個字段,那麼寫臨時表就得 累死,所以我還是推薦大家用第二種方案.
第二種方案的具體實現過程
第一步:構建HQL查詢語句:
string sql = "select new OaxtJoinGlxt(oo.Orgid,gg.Orgname) from JkptOaxtOrganization as oo , JkptGlxtOrganization as gg where oo.Orgid=" + orgid + " and oo.Suborgid=gg.Orgid";
IQuery query = session.CreateQuery(sql);
IList list = query.List();
ds = Helpers.ConvertToDataSet(list);
return ds;
第二步:根據查詢的內容構造的實體類OaxtJoinGlxt.cs如下
public class OaxtJoinGlxt
{
public OaxtJoinGlxt(decimal pOrgid, string pOrgname)
{
this._Orgid = pOrgid;
this._Orgname = pOrgname;
}
private decimal? _Orgid;
public decimal? Orgid
{
get { return _Orgid; }
set { _Orgid =value;}
}
private string _Orgname;
public string Orgname
{
get { return _Orgname; }
set { _Orgname = value; }
}
}
第三步:在相應的映射文件中導入OaxtJoinGlxt類
為了要讓NHibernate知道到什麼地方去找這個OaxtJoinGlxt類,我們需要將OaxtJoinGlxt類也導入到 hbm.xml 文件定義中,在JkptOaxtWeatherforecast.hbm.xml中添加下面的語句就可以了:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<import class="Model.OaxtJoinGlxt,Model"/>
<!--<import class="Model.WeatherforecastJoinOrganization,Model"/>-->
<class name="Model.JkptGlxtOrganization,Model" table="JKPT_GLXT_ORGANIZATION" lazy="false">
到此,已經OK了,大家看一下運行的結果.
運行結果: