Критерии гибернации волшебным образом добавляют ленивые поля в SQL - PullRequest
0 голосов
/ 31 марта 2019

В классических требованиях к данным 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-запрос неожиданно изменился, и он преследует меня уже 3 дня.

Мало того, что запрос модифицируется, он просто объединяется с тем, что есть в моем классе объекта домена.И что меня больше всего беспокоит, так это даже СОЕДИНЕНИЕ с полями @OneToMany FetchType.LAZY, что делает мой ROOT_ENTITY вообще не отличимым.Я даже пытался поместить FetchMode.SELECT в свой класс сущностей домена, но это не помогло, hibernate просто игнорирует его.Я также попытался сделать это FetchMode.SELECT в критерии по criteria.setFetchMode("oneToManyProperty", FetchMode.SELECT), также игнорируется.

И поэтому мой общий счетчик равен N (он отличается), но мой окончательный список (со свойствами пагинации) может вернуть всеROOT_ENTITIES - то же самое (результат сопоставления с таблицей OneToMany), в результате чего сущности могут быть намного больше, чем N (в зависимости от того, сколько связей в БД).работать с разбиением на страницы, поскольку он просто «различается в фильтре памяти» после извлечения данных в память.

Как Hibernate может изменить этот запрос таким образом и просто игнорировать все стратегии выборки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...