假设我有以下域名:
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
的{{1}}。目前,我必须遍历Position
上的列表,并找到Employee
与EmployeeDetailsInCompany
实体匹配的Company.Id
。这是因为Company
仅对某个Position
上的某个Employee
有效,因此Company
可以进入。
这里最好的选择是在EmployeeDetailsInCompany
和Position
之间建立关联,但这是不可能的,因为该表上的数据可能会发生变化(例如公司可能会决定擦除了解其所有员工的详细信息并再次加载新数据。)
是否有可能重写这些关联,所以我不会陷入SELECT N + 1问题(现在我必须在列表中循环)?我怎么能改变它以便更容易找到我想要的细节而不会有太多麻烦?
我考虑在EmployeeDetailsInCompany
上创建EmployeeDetailsInCompany
,使用公式进行映射,但这会给我一个只读列,并且我试图避免使用HQL。
答案 0 :(得分:1)
如果您还没有这样做,请阅读improving performance in the reference documentation上的章节。我认为特别是关于批量提取的部分是相关的。这意味着当你要求其中一个时,NHibernate可以一次性获取几个可能有趣的数据库行。
另一种选择是编写一个专门的查询来生成SQL,让DBMS完成工作。