如何在使用联接和基于行的限制(分页)的休眠中获得不同的结果?

2022-08-31 13:05:07

我正在尝试在具有与其他表联接的休眠条件查询上使用基于行的限制(例如:和)来实现分页。setFirstResult(5)setMaxResults(10)

可以理解的是,数据被随机切断;原因在这里解释。

作为解决方案,该页面建议使用“第二个 sql 选择”而不是联接。

如何将现有的条件查询(具有 使用 的联接)转换为使用嵌套选择?createAlias()


答案 1

您可以通过请求不同 ID 的列表而不是不同的水合对象列表来实现所需的结果。

只需将其添加到您的标准中:

criteria.setProjection(Projections.distinct(Projections.property("id")));

现在,您将根据基于行的限制获得正确的结果数。之所以有效,是因为投影将作为 sql 查询的一部分执行独特性检查,而不是 ResultTransformer 执行的操作,即在执行 sql 查询筛选结果以获得不同性。

值得注意的是,您现在将获得一个 id 列表,而不是获取对象列表,您可以使用它来冻结稍后休眠中的对象。


答案 2

我正在用这个与我的代码。

只需将其添加到您的标准中:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

该代码将类似于从本机 sql 的表中选择不同的 * 。希望这个有帮助。


推荐