Spring Data Pageable打破了Spring Data JPA OrderBy

Pat*_*ard 2 spring jpa spring-data spring-data-jpa

我有一个带有查找程序的简单JpaRepository,该查找程序按降序返回由名为“ number”的属性排序的记录。“ number”属性也是我实体的@Id。这很好用,但是有成千上万的记录,因此我想返回一个Page而不是一个List。

@Repository
public interface ReceiptRepository extends JpaRepository<Receipt, BigDecimal> {

    @Query
    public List<Receipt> findByStorerOrderByNumberDesc(String storer);
}
Run Code Online (Sandbox Code Playgroud)

如果我将查找器更改为以下内容,则排序将不再起作用。我试过使用Pageable参数的排序功能,但是没有用。还删除了OrderByNumberDesc,但结果相同。

@Repository
public interface ReceiptRepository extends JpaRepository<Receipt, BigDecimal> {

    @Query
    public Page<Receipt> findByStorerOrderByNumberDesc(String storer, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

编辑-添加的控制器方法

以下是我的控制器方法。

@RequestMapping(method = RequestMethod.GET, produces = {"application/json"})
public PagedResources<Receipt> receipts(Pageable pageable, PagedResourcesAssembler assembler) {
    Page<Receipt> receipts = receiptRepository.findByStorer("003845", pageable);
    return assembler.toResource(receipts, receiptResourceAssembler);
}
Run Code Online (Sandbox Code Playgroud)

我觉得这里缺少一些非常基本的东西。

我正在使用Spring Data JPA 1.5.2和Commons 1.7.2。

谢谢 :)

Ala*_*Hay 6

创建排序时,将其添加到您的Pageable中:

例如

Pageable pageable ...;
pageable.getSort().and(new Sort(Direction.ASC, "prop1", "prop1"));
Run Code Online (Sandbox Code Playgroud)

或者在Spring MVC中,您可以执行以下操作:

@RequestMapping(method = RequestMethod.GET, produces = {"application/json"})
public PagedResources<Receipt> receipts(@PageableDefaults(sort = { "x",
            "y", "z" }, value = 10)Pageable pageable, PagedResourcesAssembler assembler) {
    Page<Receipt> receipts = receiptRepository.findByStorer("003845", pageable);
    return assembler.toResource(receipts, receiptResourceAssembler);
}
Run Code Online (Sandbox Code Playgroud)

  • 查询参数以“?page = 0&size = 20&sort = number,desc”形式出现,该参数转换为page = 0,size = 20的Pageable,并在“ number”属性上以降序排序。因此,我不需要修改Pageable,它已经包含了我想要的内容。问题是它不起作用。 (2认同)