如何返回仅包含短页面信息的分页代码?

时间:2019-04-25 16:22:53

标签: java spring pagination spring-data-jpa

我正在使用Hibernate,JPA和Spring,我想返回带有分页贷款的json。我希望页面信息很简单,并且只有页面,大小和总数,如下所示:

{
  "items":[
    {
      “id”: 1,
      “total”: 2500.00
      “user_id”: 1
    },
    {
      “id”: 2,
      “total”: 65120.75
      “user_id”: 1
    }
  ],
  "paging":{
    "page": 1,
    "size": 50,
    "total": 1500
  }
 }

我有一个用于贷款的JPA存储库。

这就是我的控制器现在的样子:

@RestController
@RequestMapping("/loans")
public class LoansController {

@Autowired
private UserLoansRepository loansRep;

@GetMapping(params = { "page", "size" })
public Page<UserLoansEntity> findPaginated(@RequestParam("page") int page,
                             @RequestParam("size") int size) {

    Pageable pages = PageRequest.of(page, size);
    Page<UserLoansEntity> resultPage = loansRep.findAll(pages);

    return resultPage;
}
}

我得到的是这个

{
    "content": [
        {
            "idLoan": 10,
            "total": 222
        },
        {
            "idLoan": 11,
            "total": 3333
        },
        {
            "idLoan": 12,
            "total": 3333.33
        }
    ],
    "pageable": {
        "sort": {
            "sorted": false,
            "unsorted": true,
            "empty": true
        },
        "pageSize": 3,
        "pageNumber": 0,
        "offset": 0,
        "unpaged": false,
        "paged": true
    },
    "last": false,
    "totalPages": 2,
    "totalElements": 5,
    "first": true,
    "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
    },
    "numberOfElements": 3,
    "size": 3,
    "number": 0,
    "empty": false
}

有帮助吗?

1 个答案:

答案 0 :(得分:1)

如果将实体映射到可以从API返回的DTO对象,可能会有所帮助。

您可以手动映射属性或使用对象映射库(例如Orika,Jackson)。只是给您一个大概的想法:

PageDto pageDto = new PageDto();
pageDto.setPage(resultPage.getPageable().getPageSize());
pageDto.setSize(resultPage.getPageable().getPageNumber() + 1);
pageDto.setTotal(resultPage.getTotalElements());

pagedResponseDto.setPaging(pageDto);
pagedResponseDto.setItems(pageDto.getContent());

PageDtoPagedResponseDto的位置(大致)是:

class PageDto {

  private Integer page;
  private Integer size;
  private Integer total;
}
class PagedResponseDto<T> {

  private List<T> items;
  private PageDto pageDto;
}

这不仅可以帮助您实现目标,而且将API层中的bean与域表示分离开也是一种好习惯。