休眠标准:DISTINCT ENTITIES、FETCH JOIN和MaxResults

2022-06-16 00:00:00 criteria java Hibernate 休眠条件

当我从根元素(例如Company)向集合(例如Employees)发出带有fetchMode联接和Alias Left_out_Join的条件请求时,我无法对不同的公司进行分页(使用MaxResults和FirstElement)。

criteria = sessionFactory.getCurrentSession().createCriteria(Company.class);

criteria.createAlias("employees", "employees", JoinType.LEFT_OUTER_JOIN);
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
criteria.setFetchMode("employees", FetchMode.JOIN);

criteria.setFirstResult((pageNb - 1) * nbPerPage);
criteria.setMaxResults(nbPerPage);

如果我要求前20家公司,我只有3家,因为第一个结果有18名员工。

我希望得到要求的前20名,但员工要加载以优化延迟加载。


解决方案

我发现这个post也有类似的情况。当您将结果限制在一个条件中时,Hibernate将在SQL查询中应用该限制,而当您使用联接/DISTINCT根实体时,在许多情况下,它将导致较小的结果列表。您报告的结果证实了这一点。
建议的解决方法是将别名的获取模式更改为SELECT。结果是将调用多个查询,但肯定比每个元素的延迟加载成本更低。

相关文章