当我使用 SetFirstResult 和 SetMaxResult 并且查询已加入时,结果将具有重复的结果而不是唯一的。
然后我将所有类型的 Distinct 助手用于标准 api。但它不会过滤整个结果集,它只是过滤分页结果。
我该如何克服这个问题?
谢谢
当我使用 SetFirstResult 和 SetMaxResult 并且查询已加入时,结果将具有重复的结果而不是唯一的。
然后我将所有类型的 Distinct 助手用于标准 api。但它不会过滤整个结果集,它只是过滤分页结果。
我该如何克服这个问题?
谢谢
我发现了一个hacky 的东西来克服这个问题。
我能想出的唯一“解决方法”是从条件相同的条件对象发出两个查询。第一个获得 id,第二个被限制在 id 上。
//根据需要设置条件,包括分页 myCriteria = doStuffToSetupCriteria(); myCriteria.setFirstResult((page-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,但鉴于这种限制,我能找到唯一可接受的解决方案。
我构建了一个类似的解决方案,但仅在一次 DB 之旅中:
DetachedCriteria subQuery = ...//-->添加您想要的所有标准,包括“SetFirstResult”和“SetMaxResults”
DetachedCriteria rootQuery = DetachedCriteria.For(); // 其中 T 是一个实体
subQuery.SetProjection( Projections.Distinct(Projections.ProjectionList().Add(Projections.Alias(Projections.Property(“ID”),“ID”))) );
// 注意:我的所有实体都继承自包含属性“ID”的基类 rootQuery.Add(Subqueries.PropertyIn("ID", subQuery));
// ...然后使用rootQuery获取T的列表,不会检索到重复的项目。
我希望有人觉得这个实现有帮助:)
罗曼