Spring Boot Data JPA分页以正确的方式实现

时间:2019-01-01 12:14:57

标签: java spring spring-boot pagination spring-data-jpa

我想在Spring Boot + Spring Data JPA App中添加分页功能,我有"false"

Repository

@Repository public interface PostRepository extends JpaRepository<Post, Long> { List<Post> findAllByOrderByPostIdDesc(Pageable pageable); } 类中,我有:

Service

最后@Service public class PostService { @Autowired private PostRepository postRepository; public List<Post> findAll(Pageable pageable) { return postRepository.findAllByOrderByPostIdDesc(pageable); } }

Controller

上面在@Controller public class HomeController { @Autowired private PostService postService; @GetMapping(value = "/") public String getHomePage(Model model, Pageable pageable){ model.addAttribute("postList", postService.findAll(pageable)); return "home"; } } 映射上的代码获得了所有记录作为响应,但是如果我以http://localhost:8080的形式传递pagesize参数,则可以进行分页。

现在,我想将http://localhost:8080/?page=0&size=1设置为默认的着陆页地址,并在HTML代码中如何动态更新参数http://localhost:8080/?page=0&size=1page的值,即:

size

我尝试了很多技巧,但没有一个对我有用!

更新

我尝试并根据建议添加了此类,但是@Nyle Hassan,

 <ul class="pagination justify-content-center mb-4">
            <li class="page-item">
              <a class="page-link" th:href="@{/(page=0,size=1)}">&larr; Older</a>
            </li>
            <li class="page-item disabled">
              <a class="page-link" th:href="@{/(page=0,size=1)}">Newer &rarr;</a>
            </li>
          </ul>

它导致了:

@Configuration
public class DefaultView extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers( ViewControllerRegistry registry ) {
        registry.addViewController( "/" ).setViewName( "forward:/?page=0&size=10" );
        registry.setOrder( Ordered.HIGHEST_PRECEDENCE );
        super.addViewControllers( registry );
    }
}

1 个答案:

答案 0 :(得分:3)

  

上面http://localhost:8080映射上的代码我得到了所有记录作为响应

您确定吗?您正在使用哪个版本的Spring Boot?我检查了最新版本(2.1.1),并且在不使用任何查询参数的情况下调用http://localhost:8080将实例化一个Pageable对象,其页面= 0,大小= 20,无排序。只需尝试将调试点设置为org.springframework.data.web.PageableHandlerMethodArgumentResolver#resolveArgument即可了解Spring如何执行此绑定。

此参数解析器还附带一个注释,当您不存在查询参数时,该注释可让您更改使用的默认值。您可以像这样使用它:

@GetMapping(value = "/")
public String getHomePage(Model model, @PageableDefault(page=0, size = 1) Pageable pageable) {
    ...
}

第0页是注释的默认设置,因此具有相同的效果:

@GetMapping(value = "/")
public String getHomePage(Model model, @PageableDefault(size = 1) Pageable pageable) {
    ...
}
  

在HTML代码中,如何动态更新参数页面和大小的值

下一次,请发表两个单独的问题,但问题就在这里:

首先,在存储库和服务中将List<Post>更改为Page<Post>。在您的控制器中,将结果绑定到模型:

Page<Post> page = postService.findAll(pageable);
model.addAttribute("page", page); // page.getContent() contains the List<Page> now

然后在视图中,使用page渲染分页链接,例如像这样:

<li class="page-item">
    <a class="page-link" th:if="${page.hasPrevious()}" th:href="@{/(page=${page.previousPageable().getPageNumber()},size=${page.getSize()})}">&larr; Older</a>
</li>
<li class="page-item disabled">
    <a class="page-link" th:if="${page.hasNext()}" th:href="@{/(page=${page.nextPageable().getPageNumber()},size=${page.getSize()})}">Newer &rarr;</a>
</li>