jpa 无法使用“spring.data.web.pageable.一个索引参数=真”

y53ybaqx  于 2022-11-14  发布在  Spring
关注(0)|答案(5)|浏览(157)

在我的 Boot 服务中,我想实现一个带有分页的getAll方法,以便稍后在前端进行惰性加载。
现在我必须用页面0请求第一组行。在www.example.com中插入以下配置application.properties,它应该可以工作... spring.data.web.pageable.one-indexed-parameters=true...但它没有。
有人知道为什么吗?或者这是一种传统的方式?我在版本2.0.4.RELEASE中使用了spring-boot-starter-web和data-jpa。
多谢了!
编辑,这里是服务方法,也许PageRequest无法处理这个。

public List<TransactionResponseDTO> findAll(int pageNumber, int     pageSize) {

    List<TransactionResponseDTO> transactionResponseDTOs = new ArrayList<>();

    PageRequest pageRequest = PageRequest.of(pageNumber, pageSize);

    List<TransactionEntity> transactionEntities =
    transactionRepository.findAll(pageRequest).getContent();

    for (TransactionEntity transactionEntity : transactionEntities) {
        transactionResponseDTOs.add(convert(transactionEntity));
    }

    return transactionResponseDTOs;
}
tjrkku2a

tjrkku2a1#

属性spring.data.web.pageable.one-indexed-parameters=true仅控制如何将分页参数自动绑定到Web请求处理程序方法的Pageable参数的行为。

情况1:默认行为是spring.data.web.pageable.one-indexed-parameters=false并且在发出 * http://localhost:8080/api/customerspage=5的请求时*

@GetMapping("/api/customers")
public List<Customer> getCustomers(Pageable pageable) {
   //here pageable.getPageNumber() == 5
   Page<Customer> customersPage = customerRepository.findAll(pageable);
   //here customersPage.getNumber() == 5
}

情况2:使用spring.data.web.pageable.one-indexed-parameters=true且使用http://localhost:8080/api/customers?page=5发出请求时

@GetMapping("/api/customers")
public List<Customer> getCustomers(Pageable pageable) {
   //here pageable.getPageNumber() == 4
   Page<Customer> customersPage = customerRepository.findAll(pageable);
   //here customersPage.getNumber() == 4
}

请注意,一旦您获得数据Page customersPage,如果您选中customersPage.getNumber(),它将简单地返回**pageable.getPageNumber()**中的内容,即4。我们可能期望5,希望使用基于1的索引,one-indexed-parameters将返回5,但事实并非如此。

jhkqcmku

jhkqcmku2#

@Configuration
public class PageableConfig {

    @Bean
    PageableHandlerMethodArgumentResolverCustomizer pageableResolverCustomizer() {
        return pageableResolver -> pageableResolver.setOneIndexedParameters(true);
    }
}
xqk2d5yq

xqk2d5yq3#

我认为这是一个错误。请参阅https://github.com/spring-projects/spring-boot/issues/14413
SpringDataWebAutoConfiguration应该在RepositoryRestMvcAutoConfiguration之前,这使得PageableHandlerMethodArgumentResolverCustomizer不起作用,因此配置yml spring.data.web.pageable不起作用

ddhy6vgd

ddhy6vgd4#

您需要为存储库添加分页支持,您需要扩展

PagingAndSortingRepository<T,ID>

而不是基本的

CrudRepository<T,ID>

这将添加接受Pageable以控制返回结果的数量和页数的方法。

public Page findAll(Pageable pageable);

在此检查https://docs.spring.io/spring-data/rest/docs/2.0.0.M1/reference/html/paging-chapter.html

huus2vyu

huus2vyu5#

在互联网上有很多关于这方面的困惑。这里是阅读更多关于它的链接https://github.com/spring-projects/spring-boot/issues/14413
因为这不是解决原来问题的办法,但它可能有助于处理这个问题。
创建一个实用程序类来创建PageRequest,然后解析从存储库中获取的页面的分页信息

解释它只是减少了请求中的页码,增加了响应中的页码。这就是API使用者总是拥有一个索引页的原因。

PagintUtils类。

public class PagingUtils {
    public static PagingInfoDto getPagingInfoFromPage(Page page){
        PagingInfoDto pagingInfoDto = new PagingInfoDto();
        int currentPage = page.getNumber() + 1;
        pagingInfoDto.setCurrentPage(currentPage);
        pagingInfoDto.setTotalPages(page.getTotalPages());
        pagingInfoDto.setTotalItems(page.getTotalElements());
        pagingInfoDto.setItemPerPage(page.getSize());
        return pagingInfoDto;
    }

    public static PageRequest getPageRequest(int pageNumber, int pageSize){
        return PageRequest.of(--pageNumber, pageSize);
    }
}

例如在服务层中使用它。

Pageable pageable = PagingUtils.getPageRequest(pageNumber, pageSize);
Page<CommentEntity> page = commentsRepository.getCommentReplies(commentId, pageable);
PagingInfoDto pagingInfoDto = PagingUtils.getPagingInfoFromPage(page);

它将在json中返回,如下所示。

"PagingInfo": {
        "TotalPages": 3,
        "CurrentPage": 3,
        "TotalItems": 5,
        "ItemPerPage": 2
    }

PagingInfoDto类别

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PagingInfoDto {
    private int totalPages;
    private int currentPage;
    private long totalItems;
    private int itemPerPage;
}

相关问题