Знаете ли вы, как получить отдельный набор результатов без использования ResultTransformer при использовании SetFirstResult и SetMaxResults?

StackOverflow https://stackoverflow.com/questions/545940

Вопрос

Когда я использую 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, и ни один повторяющийся элемент не будет получен.

Надеюсь, кто-нибудь найдет эту реализацию полезной :)

Римский

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top