我正在尝试在具有联接到其他表的Hibernate Criteria查询上使用基于行的限制(例如:setFirstResult(5)和setMaxResults(10))来实现分页。
setFirstResult(5)
setMaxResults(10)
可以理解,数据是随机切断的。而其中的原因进行了说明这里。
作为解决方案,该页面建议使用“第二个SQL选择”而不是联接。
如何将现有的条件查询(使用createAlias()进行联接)转换为嵌套选择呢?
createAlias()
您可以通过请求一个不同的ID列表而不是一个不同的水合对象列表来获得所需的结果。
只需将其添加到您的条件中:
criteria.setProjection(Projections.distinct(Projections.property("id")));
现在,根据基于行的限制,您将获得正确的结果数。之所以可行,是因为投影将 作为 sql查询的 一部分 执行差异检查,而不是ResultTransformer所做的是 在 执行sql查询 之后 过滤结果的差异性。
值得注意的是,您现在将获得一个ID列表,而不是获取对象列表,您可以使用它们在以后hibernate时混合对象。