在使用SetFirstResult和SetMaxResults时,您是否知道在不使用ResultTransformer的情况下获得不同的结果集?

时间:2009-02-13 13:35:15

标签: .net nhibernate criteria distinct

当我使用SetFirstResult和SetMaxResult时,如果查询有连接,结果会有重复的结果而不是唯一的。

然后我使用所有类型的Distinct助手作为标准api。但它不会过滤整个结果集,只会过滤分页结果。

我如何克服这个问题?

由于

2 个答案:

答案 0 :(得分:4)

我发现了hacky thing to overcome这个问题。

  

这是唯一的“解决方法”   我已经能想出来了   从标准发出两个查询   相同的标准对象。第一个   得到id是第二个   与ids相关。

     

//按照自己的意愿设置crtieria,   包括分页myCriteria =   doStuffToSetupCriteria();   myCriteria.setFirstResult((页面-1)* itemsPerPage);   myCriteria.setMaxResults(itemsPerPage);

     

//获取主键列表   myCriteria.setProjection(Projections.distinct(Projections.property( “myAllias.id”));   List ids = gacc.list();

     

//现在将id添加到   限制   myCriteria.add(Restrictions.in(“myAlias.id,   IDS));

     

//从最后一个标记运行清理   gacc.setProjection(NULL);   gacc.setFirstResult(0);   gacc.setMaxResults(Integer.MAX_VALUE的);

     

//你的结果List objects =   gacc.list()

     

有点hacky我同意,但唯一的   我能找到的可接受的解决方案   这种限制。

答案 1 :(得分:1)

我建立了一个类似的解决方案,但只需一次访问DB:

DetachedCriteria subQuery = ... // - >添加您想要的所有Criterions并包含“SetFirstResult”和“SetMaxResults”

DetachedCriteria rootQuery = DetachedCriteria.For(); //其中T是实体

subQuery.SetProjection(     的 Projections.Distinct(        Projections.ProjectionList()。添加(Projections.Alias(Projections.Property(“ID”),“ID”))                         )                       );

//注意:我的所有实体都从包含属性“ID”的基类继承 rootQuery.Add(Subqueries.PropertyIn(“ID”,subQuery));

// ...然后使用rootQuery获取T列表,不会检索重复的项目。

我希望有人发现这个实现有用:)

罗曼