我首先要说的是我已经彻底查看了堆栈溢出,nhusers和文档,以找到我的问题的可能解决方案。
当急切地加载关联时,我需要能够在我的多/未来查询的部分中仅查询基类表(尽管从我做过的研究中我认为这不可能)
我已经开始使用流畅的nhibernate映射现有模式作为概念证明。我已经使用每个子类的表映射了一个继承层次结构(映射都工作得很好,所以我不会将它们全部粘贴在这里)。层次结构有大约15个子类,基类有一些额外的关联。 E.g。
Base
Dictionary<string, Attribute> Attributes
List<EntityChange> Changes
我需要急切地加载两个集合,因为它们是后期处理所需的给定方案,并且懒惰加载它们会导致性能问题。我急切地通过多个/未来的查询加载它们:
var baseQuery = session.CreateCriteria<Base>("b")
.CreateCriteria("Nested", JoinType.LeftOuterJoin)
.CreateCriteria("Nested2", JoinType.LeftOuterJoin)
.CreateCriteria("Nested2.AdditionalNested", JoinType.LeftOuterJoin);
var logsQuery = session.CreateCriteria<Base>("b").CreateAlias("Changes", "c", JoinType.LeftOuterJoin,
Expression.And(Expression.Ge("c.EntryDate", changesStartDate), Expression.Le("c.EntryDate", changesEndDate)))
.AddOrder(Order.Desc("c.EntryDate"));
var attributesQuery = session.CreateCriteria<Base>("t").SetFetchMode("Attributes", FetchMode.Join);
logsQuery.Future<Base>();
attributesQuery.Future<Base>();
var results = baseQuery.Future<Base>().ToList();
查询执行并返回正确的结果。但只是以这种方式急切加载关联意味着属性和更改查询必须执行多态获取(每个查询添加大约15个不需要的左外连接)。我知道这是多态查询所必需的,但基本查询将返回我想要的层次结构。发出多态查询的多查询的其他部分是多余的。
我尚未映射整个层次结构,因此将会执行其他不必要的连接,并且还可以预先加载其他关联。这两者结合而不增加体积将导致性能问题。此查询当前的性能大约是6秒(这无疑比它目前正在使用的20更好),但是通过查询并稍微取出额外的连接我可以将其降低到大约2秒(这是一个常见的查询,所以尽可能低,这不仅有利于我。它也将从多个分布式机器运行,所以我宁愿不进入有关缓存/二级缓存的讨论)。
我试过了
最高评级答案(How to perform a non-polymorphic HQL query in Hibernate?)的评论建议覆盖persister上的IsExplicitPolymorphism。我快速浏览了一下,据我记得,persister是每个实体的全局,或者是来自静态工厂的SessionImpl,这会阻止这样做。即使这是可能的,我也不确定这会产生什么样的副作用。
我尝试使用一些SQL加载所有内容,但即使我使用存储过程,我也不确定nhibernate如何将图形重新组合在一起。也许我可以指定所有实体和别名?
指定显式的每个查询会很好。有什么建议吗?
提前致谢。