Запрос с sort () и limit () в интерфейсе Spring Repository

Я новичок в Spring Data с MongoDB и хотел бы иметь автоматически сгенерированный метод запроса внутри моего интерфейса расширения MongoRepository, который требует фильтрации, сортировки и ограничения.

Запрос выглядит так:

// 'created' is the field I need to sort against

find({state:'ACTIVE'}).sort({created:-1}).limit(1)

Интерфейс репозитория выглядит так:

public interface JobRepository extends MongoRepository<Job, String> {
    @Query("{ state: 'ACTIVE', userId: ?0 }")
    List<Job> findActiveByUserId(String userId);

    // The next line is the problem, it wont work since
    // it's not in the format @Query expects
    @Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)")
    Job findOneActiveOldest();

    ...
}

Я знаю, что можно добавить аргумент Sort к методу запроса, чтобы получить сортировку, но проблема заключается в ограничении результатов только одним объектом. Можно ли обойтись без написания собственного JobRepositoryImpl?

Спасибо

Редактировать:

Пример того, что я ищу:

@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }")
Job findOneActiveOldest();

or

@Query("{ state:'ACTIVE' }")
@Sort("{ created:-1 }")
@Limit(1)
Job findOneActiveOldest();

Но это явно не работает :(


person m1h4    schedule 08.04.2012    source источник


Ответы (2)


Что случилось с:

public interface JobRepository extends MongoRepository<Job, String> {

  @Query("{ state : 'ACTIVE' }")
  Page<Job> findOneActiveOldest(Pageable pageable);
}

и используя его:

// Keep that in a constant if it stays the same
PageRequest request = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "created"));
Job job = repository.findOneActiveOldest(request).getContent().get(0);
person Oliver Drotbohm    schedule 09.04.2012
comment
Спасибо, Оливер, это именно то, что я искал. - person m1h4; 11.04.2012
comment
Я был так занят поиском короткого и простого решения, похожего на запрос, что не стал изучать класс Pageable и понять, что он в сочетании с сортировкой Sort обертывает функции .sort () и .limit () объекта Монго запрос. - person m1h4; 11.04.2012
comment
Я знаю, что это старый поток, но можно ли в этом случае сказать, что не следует подсчитывать общее количество элементов в коллекции, потому что страница возвращается, и вы делаете это под капотом (так что есть 2 запроса: один для данных и один для подсчета), я знаю о @QueryHints (forCounting = false) или о возвращении List вместо Page, но он работает внутри интерфейса, есть ли альтернатива @QueryHints в случае repository.doSomething ()? - person Aliaksandr Kazlou; 15.03.2013
comment
Это работает только для 1-й страницы. Если параметры подкачки передаются, скажем, от контроллера, то порядок сортировки не всегда может поддерживаться. Должен быть способ записать его в репозиторий, так же, как при использовании имен методов запроса репозитория Spring Data (которые просто становятся слишком длинными для работы с более сложными критериями фильтрации). Но, похоже, это лучшее, что вы можете сделать! - person Charlie Reitzel; 22.06.2019
comment
new PageRequest () устарел, поэтому я использовал PageRequest.of () - person TimeTraveler; 06.10.2020
comment
Как упоминал @TimeTraveler, новый PageRequest () теперь устарел. Вместо этого используйте PageRequest request = PageRequest.of(0, 1, Sort.Direction.DESC, "created"); - person Jamith NImantha; 14.04.2021

Просто добавив исправление к ответу Оливера, это Direction.DESC, а не Directions.DESC, и порядок параметров неправильный.

Изменять :

PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC));

to:

PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created"));
person Marc    schedule 30.07.2014
comment
Это должен быть комментарий, а не ответ. - person Honza Zidek; 30.07.2014
comment
Или отредактируйте исходный ответ, но теперь, когда я думаю об этом, у новых пользователей нет репутации, чтобы комментировать ИЛИ редактировать. - person shoover; 30.07.2014
comment
@Sinatr см. это обсуждение по мета, в частности по коду редактирования. в разделе "Ответы". TL; DR: SO - это справочный ресурс, а не игра; редактирование приветствуется, если оно дает улучшения; все изменения регистрируются, и любой может просмотреть историю. - person shoover; 30.07.2014
comment
Мне нужна репутация 50+, чтобы прокомментировать ответ, который я хотел уточнить, поэтому, пожалуйста, сообщите, как именно я должен был дать это разъяснение. - person Marc; 01.08.2014
comment
Спасибо! Код работал у меня с небольшими изменениями: Pageable pageable = new PageRequest (0, 1, новая сортировка (новый Sort.Order (Direction.ASC, имя), новый Sort.Order (Direction.DESC, fID))); - person Simon; 14.05.2015
comment
Как использовать приведенную выше логику, если у меня уже есть Page ‹Job› findOneActiveOldest (Pageable pageable); Метод реализован для другой цели, поэтому его реализация будет методом Duplicate в типе VisitRepository. Пожалуйста, направьте - person ; 23.06.2015