【问题标题】:How to reverse a findAll() query in the pagingAndSorting repository interface using Spring data REST如何使用 Spring 数据 REST 在 pagingAndSorting 存储库接口中反转 findAll() 查询
【发布时间】:2018-12-02 22:09:52
【问题描述】:

我有一个 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() 方法以相反的顺序返回项目。

由于是接口,这里不能直接覆盖方法。

这可能吗?

【问题讨论】:

  • 按哪个字段倒序排列?
  • 按 id,一些 spring 魔法把这个存储库变成了一个 REST 端点,所以我不确定在哪里写代码,因为这是一个接口

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


【解决方案1】:

您可以在查询方法中使用“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);

【讨论】:

  • 问题是,如果我创建一个自定义方法 findAllByIdOrderByDesc(),我不确定如何将它连接到由 spring 依赖项创建的自动生成的 REST 端点:spring-boot-starter-data-休息
  • @csch0 所以你正在使用 Spring Data REST - 你应该在问题中写到它......
  • OK 会更新说 Spring data Rest 而不是 rest!
【解决方案2】:

我认为您可以使用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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 2021-11-11
    • 2018-06-15
    相关资源
    最近更新 更多