将三重连接SQL映射到非hibernate.(旧数据库与奇怪的设计)
本文关键字:数据库 hibernate 三重 连接 SQL 映射 | 更新日期: 2023-09-27 18:03:33
我正在努力将一个用powerbuilder编写的旧应用程序转换为。net应用程序。在这个过程中,我们使用一个旧数据库,并且在powerbuilder应用程序中使用的一些查询转换为非hibernate流畅映射(至少对我来说)是相当具有挑战性的。
我有以下sql来获取位的列表:
SELECT MYSCHEME.BIT.BIT_S,
MYSCHEME.BIT.BIT_NAME,
MYSCHEME.BIT.BIT_TYPE,
MYSCHEME.BIT.BIT_SIZE,
MYSCHEME.BS.BS_NAME,
MYSCHEME.CMS.WHOLE_S
FROM MYSCHEME.BIT join MYSCHEME.BS on ( MYSCHEME.BIT.BS_S = MYSCHEME.BS.BS_S )
left outer join MYSCHEME.OF on MYSCHEME.BIT.BIT_TYPE_S = MYSCHEME.OF.F_S
left outer join MYSCHEME.CMS on MYSCHEME.OF.OF_S = MYSCHEME.CMS.PART_S
WHERE ( MYSCHEME.BS.BS_S = 25)
我应该如何将它映射到nhibernate?我应该使用标准和连接,或者只是映射它与其他表的引用?另一个挑战是数据库中的键约束非常少,例如BIT和OF之间没有键约束,或者CMS和OF之间没有键约束。
谁有解决这个挑战的好主意?我还必须能够更新CMS.WHOLE_S.
第一个连接到BS表不是很重要,因为它只是获取"父"信息,我可以从应用程序的其他部分访问该信息。
class Bit
{
public virtual BS Bs { get; set; }
public virtual int WholeS
{
get { return Bs.Of.CMS.WholeS; }
set { Bs.Of.CMS.WholeS = value; }
}
}
class BS
{
public virtual Of Of { get; set; }
}
class Of
{
public virtual CMS CMS { get; set; }
}
class CMS
{
public virtual int WholeS { get; set; }
}
class BitMap : ClassMap<Bit>
{
public BitMap()
{
References(bit => bit.Bs, "BS_S")
.Not.LazyLoad(); // should take care, that all is join-loaded
}
}
...
Bit bit = session.Get<Bit>(25);
int wholeS = bit.Bs.Of.CMS.WholeS;
奥得河
Bit bit = session.Get<Bit>(25);
int wholeS = bit.WholeS;