使用NHibernate时限制结果数量

时间:2009-02-20 09:27:42

标签: .net nhibernate

我想知道人们通常如何限制查询返回的实体数量。我知道SetMaxResults,但是一旦涉及到连接,这似乎就会崩溃 - 每个2个子节点的3个实体将产生6行。如果我使用SetMaxResults(3)只获得3个实体,我将只得到3个结果行,这可能会给我一个不完整的对象图。

我知道这是由于DistinctRootEntityResultTransformer,但我想知道其他人做了什么来避免获得1000行只是为了获得构建我的3个实体所需的6行。

2 个答案:

答案 0 :(得分:4)

我的回答可能不是100%准确,因为我是Java Hibernate类型的人,但我猜测NHibernate的设计与它的java表兄完全相同。

Hibernate承诺查询结果中的项目数量将完全等于查询返回的行数。这很好,因为通常查询为每个实体返回一行,当查询连接到另一个表并生成笛卡尔积时,问题就出现了。

几个选项:

  1. 从查询中删除所有“加入”条件/子句。如果它们仅用于性能,这可能很容易,请注意它们可以替换为不会创建连接的'fetch'子句
  2. 将sql限制添加到在最终sql
  3. 的where子句中创建子查询的条件

    注意这不是hibernate或nhibernate的特殊情况,pagign一个联合的结果集只是简单的不可能(有蛮力和无知)

    希望这有帮助

答案 1 :(得分:0)

您可以发布您的映射文件和您正在使用的查询吗?我不确定我是否完全理解这个问题,或者DistinctRootEntityResultTransformer是如何发挥作用的,但如果你的实体包含其他实体的集合,或者是连接子类关系的一部分,(或其他关系?)NHibernate会做连接为了填充实体(即使您的查询中没有明确的连接)。

您可以通过在特定映射上设置lazy属性来阻止hibernate执行各种连接。如果你最终使用它,它只会获取数据。