在前面的教程中,我们已经看到了如何使用 Spring Data 分页 Web 支持。在本教程中,我们将了解如何使用排序支持。
在基于 Web 的应用程序中应用排序主要有两种方法:
我们在前面的示例中使用过,但没有任何排序查询参数。除了分页信息外,还可以设置排序信息(查看这个和这个)。在这种情况下,我们必须使用类似于以下内容的查询字符串:PageablePageable
?page=1&size=10&sort=personName,desc
相当于:
PageRequest.of(1,10, Sort.by("personName").descending())
我们也可以用作控制器方法参数(查看我们的排序基本示例)。在这种情况下,我们需要创建类似于以下内容的查询字符串:Sort
?sort=personName,desc
相当于:
Sort.by("personName").descending()
此批注定义将 Sort 实例注入控制器处理程序方法时要使用的默认排序选项。
在上述两种情况下,用于从请求参数或 SortDefault 注释自动创建排序实例。当我们在配置类中使用时,此解析器处于活动状态。SortHandlerMethodArgumentResolver@EnableSpringDataWebSupport
@Entity
public class Employee {private @Id@GeneratedValueLong id;private String name;private String dept;private int salary;.............
}
public interface EmployeeRepository extends PagingAndSortingRepository {@Query("SELECT DISTINCT e.dept FROM Employee e")List findAllDepartments(Sort sort);
}
我们在上面的存储库 withparameter 中创建了一个自定义查询方法,以便我们可以在控制器中使用 Sort 参数,该参数只会为视图生成部门列表。Sort
在下面的控制器中,我们将使用两种处理程序方法,一种是使用可分页参数,另一种是使用 Sort 参数:
@Controller
public class EmployeeController {@Autowiredprivate EmployeeRepository repository;@GetMapping("/employees")public String getEmployees(@PageableDefault(size = 10, sort = "id") Pageable pageable,Model model) {Page page = repository.findAll(pageable);List sortOrders = page.getSort().stream().collect(Collectors.toList());if (sortOrders.size() > 0) {Sort.Order order = sortOrders.get(0);model.addAttribute("sortProperty", order.getProperty());model.addAttribute("sortDesc", order.getDirection() == Sort.Direction.DESC);}model.addAttribute("page", page);return "employee-page";}@GetMapping("departments")public String getDepartments(@SortDefault(sort="dept",direction = Sort.Direction.ASC)Sort sort, Model model) {List depts = repository.findAllDepartments(sort);model.addAttribute("depts", depts);return "dept-page";}
}
跟随视图同时实现排序和分页。我们正在通过单击表标题进行单列排序。这类似于Java Swing JTable排序功能(在此处查看示例)。
我们使用 JQuery 来处理表头单击和显示箭头;▾ 和 ▴ 分别在正确的位置进行降序和升序排序。
src/main/webapp/WEB-INF/views/employee-page.html
Employees
Id Name Department Salary
以下视图仅显示部门列表。相应的处理程序方法(如上所示)仅使用参数。Sort
src/main/webapp/WEB-INF/views/dept-page.html
Departments
In ascending order
In descending order
要尝试示例,请运行以下示例项目的嵌入式tomcat(在pom中配置.xml):
mvn tomcat7:run-war
localhost:8080/employees

如上所示,默认情况下选择第一页,并按升序对“id”列进行排序。让我们点击“名称”列标题:

查看上面地址栏中的查询字符串,其中存在所有必需的查询参数。单击“名称”标题上的更多时间将更改排序方向:

单击分页按钮可保留上次排序的列。

让我们通过本地主机访问部门页面:localhost:8080/departments

单击底部的“降序”链接将按降序显示部门:

Employees
Id Name Department Salary
0}">总计99行,当前显示1 -5行 总计99页
添加搜索/过滤功能
package com.example;import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;public interface EmployeeRepository extends JpaRepository {@Query("SELECT e FROM Employee e WHERE CONCAT(e.name, ' ', e.dept) LIKE %?1%")public Page search(String keyword, Pageable pageable);
}
package com.example;import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.query.Param;
import org.springframework.data.web.PageableDefault;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class EmployeeController {@Autowiredprivate EmployeeRepository repository;@GetMapping("/employees")public String getEmployees(@Param("keyword") String keyword, @PageableDefault(size = 10, sort = "id") Pageable pageable,Model model) {if (keyword == null) {Page page = repository.findAll(pageable);List sortOrders = page.getSort().stream().collect(Collectors.toList());if (sortOrders.size() > 0) {Sort.Order order = sortOrders.get(0);model.addAttribute("sortProperty", order.getProperty());model.addAttribute("sortDesc", order.getDirection() == Sort.Direction.DESC);}model.addAttribute("page", page);} else {Page page = repository.search(keyword, pageable);List sortOrders = page.getSort().stream().collect(Collectors.toList());if (sortOrders.size() > 0) {Sort.Order order = sortOrders.get(0);model.addAttribute("sortProperty", order.getProperty());model.addAttribute("sortDesc", order.getDirection() == Sort.Direction.DESC);}model.addAttribute("keyword", keyword);model.addAttribute("page", page);}return "employee-page";}}
Employees
Id Name Department Salary
0}">总计99行,当前显示1 -5行 总计99页

https://www.logicbig.com/tutorials/spring-framework/spring-data/sorting-and-pagination/spring-data-jpa-sorting-and-pagination.zip
下一篇:Linux 文件/目录管理