Знаете ли вы в любом случае, чтобы получить отличный набор результатов без использования ResultTransformer при использовании SetFirstResult и SetMaxResults? - PullRequest
3 голосов
/ 13 февраля 2009

Когда я использую SetFirstResult и SetMaxResult и если в запросе есть объединения, результат будет дублировать результаты, а не уникал.

Тогда я использую все типы различных помощников для критериев API. Но он не фильтрует весь набор результатов, он просто фильтрует постраничный результат.

Как я могу преодолеть эту проблему?

Спасибо

Ответы [ 2 ]

4 голосов
/ 13 февраля 2009

Я нашел хакерскую вещь, чтобы преодолеть эту проблему.

Единственный «обходной путь» для этого, который Я был в состоянии придумать это выдать два запроса по критериям тот же критерий объекта. Первый получает идентификатор второй в отличие от ид.

// настроить критерии по вашему желанию, включая пагинацию myCriteria = doStuffToSetupCriteria (); myCriteria.setFirstResult ((страница-1) * itemsPerPage); myCriteria.setMaxResults (itemsPerPage);

// получаем список, если первичные ключи myCriteria.setProjection (Projections.distinct (Projections.property ( "myAllias.id")); Список идентификаторов = gacc.list ();

// теперь добавляем идентификаторы в ограничение myCriteria.add (Restrictions.in ( "myAlias.id, Идентификаторы));

// очистка от последнего запуска gacc.setProjection (нуль); gacc.setFirstResult (0); gacc.setMaxResults (Integer.MAX_VALUE);

// список ваших результатов = gacc.list ()

Немного хакерский, я согласен, но единственный приемлемое решение, которое я мог бы найти, учитывая это ограничение.

1 голос
/ 17 июля 2009

Я создал похожее решение, но всего за одну поездку в БД:

DetachedCriteria subQuery = ... // -> Добавить все необходимые критерии, включая «SetFirstResult» и «SetMaxResults»

DetachedCriteria rootQuery = DetachedCriteria.For (); // где T - сущность

subQuery.SetProjection ( Projections.Distinct ( Projection.ProjectionList (). Add (Projection.Alias ​​(Projection.Property ("ID"), "ID")) ) );

// Примечание: все мои сущности наследуются от базового класса, который содержит свойство "ID" rootQuery.Add (Subqueries.PropertyIn ("ID", subQuery));

// ... затем используйте rootQuery для получения списка T, и повторный элемент не будет получен.

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

1017 * Román *

...