2009-02-13 2 views
3

Когда я использую SetFirstResult и SetMaxResult, и если запрос объединяется, результат имеет повторяющиеся результаты, а не уникальные.Знаете ли вы, что вы получили отличный результат без использования ResultTransformer при использовании SetFirstResult и SetMaxResults?

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

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

Благодаря

ответ

4

Я нашел hacky thing to overcome этот вопрос.

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

// настроить crtieria как пожелаете, включая разбиение на страницы myCriteria = doStuffToSetupCriteria(); myCriteria.setFirstResult ((page-1) * itemsPerPage); myCriteria.setMaxResults (itemsPerPage);

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

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

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

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

Немного Hacky я согласен, но только приемлемым soltion я мог бы найти дал это limitiation.

+1

ResultTransformer фильтры результатов на клиенте, но Projections.Distinct должен выдавать «отчетливый» ключевое слово в запросе. Разве это не работает? –

+0

Значит ли это «на клиенте», что он получает все данные из БД и фильтрует его на плунге вместо сервера sql? –

+0

ohh, это действительно опасно использовать. Projections.Distinct является победителем тогда :) –

1

Я построил похожее решение, но только в одной поездки в БД:

DetachedCriteria подзапрос = ... // -> Добавить все КРИТЕРИИ вы хотите и инклюзивный «SetFirstResult» и «SetMaxResults»

DetachedCriteria rootQuery = DetachedCriteria.For(); // где Т Субъект

subQuery.SetProjection ( Projections.Distinct ( Projections.ProjectionList(). Добавить (Projections.Alias ​​(Projections.Property ("ID"), "ID")) ) );

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

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

Я надеюсь, что кто-то найти эту реализацию ПОЛЕЗНЫЕ :)

РОМАН

+0

Я не могу заставить это работать :(У кого-нибудь есть идеи? – AHungerArtist