当我使用SetFirstResult和SetMaxResult时,如果查询有连接,结果会有重复的结果而不是唯一的。
然后我使用所有类型的Distinct助手作为标准api。但它不会过滤整个结果集,只会过滤分页结果。
我如何克服这个问题?
由于
答案 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列表,不会检索重复的项目。
我希望有人发现这个实现有用:)
罗曼