Знаете ли вы, как получить отдельный набор результатов без использования ResultTransformer при использовании SetFirstResult и SetMaxResults?
-
23-08-2019 - |
Вопрос
Когда я использую SetFirstResult и SetMaxResult, и если запрос объединяется, результат имеет повторяющиеся результаты вместо уникальных.
Затем я использую все типы различных помощников для API критериев.Но он не фильтрует весь набор результатов, а просто фильтрует постраничный результат.
Как я могу преодолеть эту проблему?
Спасибо
Решение
Я нашел хакерская вещь, которую нужно преодолеть Эта проблема.
Единственный "обходной путь" для этого Я был в состоянии придумать это для выдать два запроса из критериев те же критерии объекта.Первый получает идентификатор второй Meme it привязаны к идентификаторам.
//настройте crtieria по вашему желанию, включая подкатегоризацию myCriteria = doStuffToSetupCriteria();myCriteria.setFirstResult((page-1)*itemsPerPage);myCriteria.setMaxResults(itemsPerPage);
//получить список если первичные ключи myCriteria.setProjection(Projections.distinct(Projections.property("myAllias.id"));Идентификаторы списков = gacc.list();
//теперь добавляем id в ограничение myCriteria.add(Restrictions.in("myAlias.id, идентификаторы));
//очистка от последнего запуска critiera gacc.setProjection(null);gacc.setFirstResult(0);gacc.setMaxResults(Integer.MAX_VALUE);
//ваши результаты Список объектов = gacc.list()
Немного хаки я согласен, но единственный приемлемое решение, которое я мог бы найти, данное это ограничение.
Другие советы
Я создал похожее решение, но всего за один переход к БД:
Подзапрос DetachedCriteria = ...//-->Добавьте все нужные критерии, включая «SetFirstResult» и «SetMaxResults».
DetachedCriteria rootQuery = DetachedCriteria.For();// где T — сущность
subQuery.SetProjection( Projections.Distinct( Projections.ProjectionList().Add(Projections.Alias(Projections.Property("ID"), "ID")) ) );
// Примечание:все мои сущности наследуют от базового класса, который содержит свойство "ID" rootQuery.Add(Subqueries.PropertyIn("ID", subQuery));
// ...затем используйте rootQuery для получения списка T, и ни один повторяющийся элемент не будет получен.
Надеюсь, кто-нибудь найдет эту реализацию полезной :)
Римский