Spring Data Pageable打破Spring Data JPA OrderBy

时间:2014-05-16 13:52:47

标签: spring jpa spring-data spring-data-jpa

我有一个带有finder的简单JpaRepository,它返回由名为" number"的属性排序的记录。按降序排列。 "数字" property也是我实体的@Id。这很好用,但是有成千上万的记录,所以我想返回一个Page而不是List。

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

    @Query
    public List<Receipt> findByStorerOrderByNumberDesc(String storer);
}

如果我将取景器更改为以下内容,则排序不再有效。我尝试过使用Pageable参数的排序功能,但它没有用。同时删除了OrderByNumberDesc,但结果相同。

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

    @Query
    public Page<Receipt> findByStorerOrderByNumberDesc(String storer, Pageable pageable);
}

编辑 - 添加控制器方法

以下是我的控制器方法。

@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);
}

我觉得我在这里遗漏了一些非常基本的东西。

我使用的是Spring Data JPA 1.5.2和Commons 1.7.2。

谢谢:)

1 个答案:

答案 0 :(得分:5)

在您的Pageable创建时将其添加到Pageable:

e.g。

Pageable pageable ...;
pageable.getSort().and(new Sort(Direction.ASC, "prop1", "prop1"));

或者在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);
}