假设我有以下域:
public class Company
{
public long Id;
}
public class EmployeeDetailsInCompany
{
public long Id;
public Company Company;
}
public class Employee
{
public long Id;
public List<EmployeeDetailsInCompany> EmployeeDetailsInCompany;
}
public class Position
{
public long Id;
public Employee Employee;
public Company Company;
}
(请注意,这是一个非常简化的版本,使问题更易于理解。)
基本上,我想访问
EmployeeDetailsInCompany
实体中的Employee
的Position
。目前,我必须遍历Employee
上的列表,找到EmployeeDetailsInCompany
与我的Company.Id
实体匹配的Company
。这是因为Position
仅对某个Employee
上的某个Company
有效,因此EmployeeDetailsInCompany
进入该位置。最好的选择是在
Position
和EmployeeDetailsInCompany
之间建立关联,但这是不可能的,因为该表上的数据可以更改(例如,公司可能决定擦除其所有员工详细信息并再次加载新数据)。是否可以重写这些关联,以免出现SELECT N + 1问题(现在必须循环遍历该列表)?我该如何更改它,以使其更轻松地找到想要的细节而又省事?
我已经考虑过在
EmployeeDetailsInCompany
上创建一个Position
,可以使用公式对其进行映射,但这将为我提供一个只读列,而我试图避免使用HQL。 最佳答案
如果尚未阅读improving performance in the reference documentation章节,请阅读。我认为特别是有关批量提取的部分很重要。这意味着,NHibernate可以在您需要其中之一时一次性获取多个可能有趣的数据库行。
另一个选择是编写一个专门的查询,该查询将生成SQL以让DBMS完成工作。