(在制定适当的标题时感到非常无助…)
是否可以为类定义映射,以便使用联接查询从另一个表中提取某些属性?
在我的C应用程序中,我显示了“A”对象的列表,以及它们关联的“B”对象的一些属性和B关联的“C”对象的属性:
A.Name B.Name B.SomeValue C.Name
Foo Bar 123 HelloWorld
Bar Hello 432 World
...
要澄清:A有FK到B,B有FK到C(例如,BankAccount->Person->Company)。
如果我通过属性“bname”、“bsomevalue”和“cname”扩展类A,我可以使[n]Hibernate发出类似的查询吗?
select A.Name, B.Name as BName, B.SomeValue as BSomeValue, C.Name as CName
from A
join B on A.B_ID = B.ID
join C on B.C_ID = C.ID
并将这些查询的所有结果映射到a的属性上?
背景:
我尝试了两种方法从数据库中加载这些属性(使用nhibernate):快速方法和干净方法。我的
最终的问题
是怎么做的
快速清理
方法。
快速进场:
-
在数据库中定义连接A、B、C并提供所有这些字段的视图。
-
在A类中,定义属性“bname”、“bsomevalue”、“cname”
-
定义A和视图之间的休眠映射,而所需的B和C属性则用
update="false" insert="false"
实际上是从B和C表中派生出来的,但是Hibernate不知道这一点,因为它使用视图。
这样,列表只为每个“A”记录加载一个对象,这非常快。如果代码试图访问实际的关联属性“a.b”,我会发出另一个HQL查询来获取b,设置该属性并更新伪造的bname和bsomeValue属性。
清洁方法:
-
没有风景。
-
A类映射到表A、B到B、C到C。
-
加载a的列表时,我会执行双左联接获取以获取b和c:
from A a left join fetch a.B left join fetch a.B.C
-
b.名称、b.someValue和c.名称通过热切加载的关联进行访问。
这种方法的缺点是速度变慢,占用了更多的内存,因为它需要为每个“A”记录创建和映射3个对象:每个A、B和C对象。
快速干净的方法:
使用隐藏连接的数据库视图,并将其作为表在nhibernate中处理,我觉得有点不舒服。所以我想做一些类似的事情:
-
数据库中没有视图。
-
在类“A”中声明属性“bname”、“bsomevalue”、“cname”。
-
定义的映射,以便nhibernate像数据库视图那样使用join-sql查询将a和这些属性一起提取。
-
映射仍应允许定义惰性的多对一关联以获取a.b.c。
我的问题: