Hibernate Criteria神奇地将LAZY字段添加到SQL

时间:2019-03-30 23:04:47

标签: hibernate hibernate-criteria

在经典的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如何以这种方式修改该查询,而忽略所有获取策略?

0 个答案:

没有答案