3

当我使用 SetFirstResult 和 SetMaxResult 并且查询已加入时,结果将具有重复的结果而不是唯一的。

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

我该如何克服这个问题?

谢谢

4

2 回答 2

4

我发现了一个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,但鉴于这种限制,我能找到唯一可接受的解决方案。

于 2009-02-13T14:21:59.583 回答
1

我构建了一个类似的解决方案,但仅在一次 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的列表,不会检索到重复的项目。

我希望有人觉得这个实现有帮助:)

罗曼

于 2009-07-16T20:08:11.580 回答