Запрос с параметрами sort() и limit() в Spring интерфейсе репозитория
Я новичок в 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 not in the format @Query expects
@Query("find({state:'ACTIVE'}).sort({created:-1}).limit(1)")
Job findOneActiveOldest();
...
}
Я знаю, что для сортировки можно добавить аргумент Sort для метода запроса, но проблема ограничивает результаты только одним объектом. Можно ли это сделать без необходимости писать пользовательский JobRepositoryImpl?
Спасибо
Edit:
Пример того, что я ищу:
@Query("{ state:'ACTIVE', $orderby: {created:-1}, $limit:1 }")
Job findOneActiveOldest();
или
@Query("{ state:'ACTIVE' }")
@Sort("{ created:-1 }")
@Limit(1)
Job findOneActiveOldest();
Но это, очевидно, не работает: (
Ответы
Ответ 1
Что случилось с:
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);
Ответ 2
Просто добавив исправление к ответу Оливера, оно Direction.DESC
, а не Directions.DESC
, и порядок параметров неверен.
Изменить:
PageRequest request = new PageRequest(0, 1, new Sort("created", Directions.DESC));
в
PageRequest request = new PageRequest(0, 1, new Sort(Direction.DESC, "created"));