Критерии гибернации: отдельные объекты, Fetch join и MaxResults - PullRequest
0 голосов
/ 30 января 2019

Когда у меня есть запрос Criteria от корневого элемента (например, Company) с fetchMode JOIN и псевдонимом LEFT_OUTER_JOIN в коллекцию (например, Employees), мне не удается разбить страницы на отдельные компании (с 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 сотрудников.но с загруженными сотрудниками, чтобы оптимизировать ленивую загрузку.

1 Ответ

0 голосов
/ 30 января 2019

Я нашел этот пост , в котором похожая ситуация.Когда вы ограничиваете свои результаты в критериях, hibernate будет применять ограничение в запросе SQL, а когда вы работаете с объединениями / различными корневыми объектами, во многих случаях это приводит к уменьшению списка результатов.Результаты, о которых вы сообщили, подтверждают это.
Предложенный обходной путь - изменить режим выборки для вашего псевдонима на SELECT.В результате будет вызвано более одного запроса, но, безусловно, будет дешевле, чем ленивая загрузка для каждого элемента.

...