我想知道人们通常如何限制查询返回的实体数量。我知道SetMaxResults,但是一旦涉及到连接,这似乎就会崩溃 - 每个2个子节点的3个实体将产生6行。如果我使用SetMaxResults(3)只获得3个实体,我将只得到3个结果行,这可能会给我一个不完整的对象图。
我知道这是由于DistinctRootEntityResultTransformer,但我想知道其他人做了什么来避免获得1000行只是为了获得构建我的3个实体所需的6行。
答案 0 :(得分:4)
我的回答可能不是100%准确,因为我是Java Hibernate类型的人,但我猜测NHibernate的设计与它的java表兄完全相同。
Hibernate承诺查询结果中的项目数量将完全等于查询返回的行数。这很好,因为通常查询为每个实体返回一行,当查询连接到另一个表并生成笛卡尔积时,问题就出现了。
几个选项:
注意这不是hibernate或nhibernate的特殊情况,pagign一个联合的结果集只是简单的不可能(有蛮力和无知)
希望这有帮助
答案 1 :(得分:0)
您可以发布您的映射文件和您正在使用的查询吗?我不确定我是否完全理解这个问题,或者DistinctRootEntityResultTransformer是如何发挥作用的,但如果你的实体包含其他实体的集合,或者是连接子类关系的一部分,(或其他关系?)NHibernate会做连接为了填充实体(即使您的查询中没有明确的连接)。
您可以通过在特定映射上设置lazy属性来阻止hibernate执行各种连接。如果你最终使用它,它只会获取数据。