在经典的Hibernate Criteria数据需求中,我遇到一个问题,我需要对结果进行分页,因此我需要计算总行数,然后选择分页数据。
当我打电话
criteria.setProjection(Projections.rowCount());
int count = (int)criteria.list().get(0);
SQL查询完全符合我的期望(从实体开始,仅与条件中存在的表联接)
但是当我这样做
criteria.setMaxResults(pageable.getPageSize());
criteria.setFirstResult((int) pageable.getOffset());
criteria.setProjection(null);
criteria.setResultTransformer(Criteria.ROOT_ENTITY);
List<T> list = criteria.list();
我的SQL查询被意外修改,并且困扰了我三天了。
不仅该查询被修改,它还与域对象类中的所有内容进行联接。最让我困扰的是,它甚至连带有@OneToMany FetchType.LAZY
字段的JOIN都使我的ROOT_ENTITY完全不同。我什至试图将FetchMode.SELECT
放到我的域实体类中,没有帮助,休眠只是忽略它。我还尝试通过criteria.setFetchMode("oneToManyProperty", FetchMode.SELECT)
将FetchMode.SELECT设置为标准,也将其忽略。
因此,我的总数为N(不同),但是我的最终列表(具有分页属性)可能会返回所有相同的ROOT_ENTITIES(映射到OneToMany表的结果),导致实体多于N(取决于数据库中有多少个关系。
DISTINCT_ROOT_ENTITY对我来说是行不通的,因为它不适用于分页,因为它只是在将数据提取到内存后“在内存过滤器中与众不同”。
Hibernate如何以这种方式修改该查询,而忽略所有获取策略?