Spring Data JPA - Web 支持、排序和分页
创始人
2024-03-15 04:40:10

在前面的教程中,我们已经看到了如何使用 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()

@SortDefault注释

此批注定义将 Sort 实例注入控制器处理程序方法时要使用的默认排序选项。

SortHandlerMethodArgumentResolver

在上述两种情况下,用于从请求参数或 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

MVC 控制器

在下面的控制器中,我们将使用两种处理程序方法,一种是使用可分页参数,另一种是使用 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";}
}

Thymeleaf 视图

跟随视图同时实现排序和分页。我们正在通过单击表标题进行单列排序。这类似于Java Swing JTable排序功能(在此处查看示例)。

我们使用 JQuery 来处理表头单击和显示箭头;▾ 和 ▴ 分别在正确的位置进行降序和升序排序。

src/main/webapp/WEB-INF/views/employee-page.html






Employees

IdNameDepartmentSalary

以下视图仅显示部门列表。相应的处理程序方法(如上所示)仅使用参数。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

IdNameDepartmentSalary
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

IdNameDepartmentSalary
0}">总计99行,当前显示1 -5行   总计99

 

示例项目

https://www.logicbig.com/tutorials/spring-framework/spring-data/sorting-and-pagination/spring-data-jpa-sorting-and-pagination.zip

相关内容

热门资讯

应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...