Java Hibernate条件:不同实体、获取连接和MaxResults

Java Hibernate条件:不同实体、获取连接和MaxResults,java,hibernate,criteria,hibernate-criteria,Java,Hibernate,Criteria,Hibernate Criteria,当我有一个来自根元素(例如公司)的条件请求,其中包含fetchMode连接和别名LEFT_OUTER_连接到集合(例如Employees)时,我无法对不同的公司进行分页(使用MaxResults和firstElement) 如果我问前20家公司,我只有3家,因为第一个结果有18名员工 我希望按照要求获得前20名,但通过加载员工来优化延迟加载。我发现这种情况与此类似。当您在条件中限制结果时,hibernate将在SQL查询中应用该限制,并且在许多情况下,当您使用联接/不同的根实体时,它将导致较小的

当我有一个来自根元素(例如公司)的条件请求,其中包含fetchMode连接和别名LEFT_OUTER_连接到集合(例如Employees)时,我无法对不同的公司进行分页(使用MaxResults和firstElement)

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

我希望按照要求获得前20名,但通过加载员工来优化延迟加载。

我发现这种情况与此类似。当您在条件中限制结果时,hibernate将在SQL查询中应用该限制,并且在许多情况下,当您使用联接/不同的根实体时,它将导致较小的结果列表。您报告的结果证实了这一点。

建议的解决方法是将别名的提取模式更改为
SELECT
。结果是将调用多个查询,但肯定比每个元素的延迟加载成本更低。

它不会改变任何东西。即使使用SELECT,结果也相同。事实上,我不使用limit方法,而是使用setMaxResults和setFirstResult。
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);