如何使用Spring数据REST在分页和排序存储库接口中反转findAll()查询

时间:2018-06-23 20:22:10

标签: spring spring-boot jpa spring-data-jpa spring-data-rest

我有一个Spring JPA rest存储库。

public interface SumLogRepository extends PagingAndSortingRepository<SumLog, Long> {

    //custom query method
    List<SumLog> findByFoo(String lastName);

    //How do I make this method return the results in REVERSE order?
    List<SumLog> findAll();

}

我希望findAll()方法以相反的顺序返回项目。

由于具有接口,因此无法在此处直接覆盖方法。

这可能吗?

2 个答案:

答案 0 :(得分:3)

您可以在查询方法中使用'OrderBy'和'Desc'关键字:

List<SumLog> findAllByOrderByIdDesc();

在这种情况下,您将获得以下SQL查询:

select ... from sum_logs sl order by sl.id desc

更多信息:Query Creation

已更新

要更改存储库默认方法的行为,您可以使用自己的查询覆盖它们:

@Query("select sl from SimLog order by sl.id desc")
@Override
List<SumLog> findAll();

@Query("select sl from SimLog order by sl.id desc")
@Override
Page<SumLog> findAll(Pageable pageable);

更新2

更灵活的方法-如果尚未设置排序顺序,则可以通过'id desc'进行设置:

@Override
default Page<SumLog> findAll(Pageable p) {
    if (p.getSort().isUnsorted()) {
        findAllBy(PageRequest.of(p.getPageNumber(), p.getPageSize(), Sort.by(Sort.Direction.DESC, "id")));
    }
    return findAllBy(p);
}

Page<SumLog> findAllBy(Pageable pageable);

答案 1 :(得分:1)

我认为您可以像下面这样使用Pageable进行分页和排序。

public interface SumLogRepository extends PagingAndSortingRepository<SumLog, Long> {
     Page<SumLog> findAll(Pageable pageable);
}

使用示例。

Pageable pageable = new PageRequest(0,20 , new Sort(Sort.Direction.DESC, "id"));
Page<SumLog> pageSumLog = sumLogRepository.findAll(pageable);

并且spring可以绑定pageable以便在这样的控制器中使用。 (参考:https://docs.spring.io/spring-data/rest/docs/current/reference/html/#paging-and-sorting.sorting

@GetMapping("/sumlogs")
public ResponseList<SumLog> retrieveLogs(Pageable pageable) {
    Page<SumLog> pageSumLog = sumLogRepository.findAll(pageable)
    return new ResponseList<>(pageSumLog);
}