你知道反正得到一个不同的结果,而无需使用SetFirstResult和SetMaxResults时,使用使用ResultTransformer设置?
-
23-08-2019 - |
题
当我使用SetFirstResult和SetMaxResult并且如果查询具有加入结果有重复的结果,而不是唯一的。
然后,我使用的标准API的所有类型鲜明帮手。但它不过滤整个结果集,它只是过滤分页的结果。
我怎样才能解决这个问题?
由于
解决方案
我已经找到了哈克事情克服这个问题。
唯一的“解决方法”为此该 我已经能够拿出是 从发布的标准两个查询 相同条件对象。第一个 得到的ID第二个是 contrained到IDS。
//设置crtieria如你所愿, 包括分页myCriteria = doStuffToSetupCriteria(); myCriteria.setFirstResult((页面-1)* itemsPerPage); myCriteria.setMaxResults(itemsPerPage);
//获取列表中,如果主键 myCriteria.setProjection(Projections.distinct(Projections.property( “myAllias.id”)); 列表ID = gacc.list();
//现在添加的ID进入 限制 myCriteria.add(Restrictions.in(“myAlias.id, IDS));
从最后的条件而定运行//清理 gacc.setProjection(NULL); gacc.setFirstResult(0); gacc.setMaxResults(Integer.MAX_VALUE的);
//搜索结果对象列表= gacc.list()
一个小哈克我同意,但唯一的 接受soltion我能找到给定 此limitiation。
其他提示
我建立一个类似的解决方案,但仅在一个行程DB:
的DetachedCriteria的子查询= ... // - >添加你想要的所有规范和包容性的 “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”,子查询));
// ...然后使用rootQuery得到T的列表和没有重复的项目将被检索。
我希望有人发现这个实现有帮助:)
罗曼