Spring JPA 拓展
Spring JPA 拓展
本节记录了一组Spring数据扩展,它们支持在各种上下文中使用Spring数据。目前,大部分集成都是针对Spring MVC的。
1、Querydsl 拓展
Querydsl是一个框架,它支持通过其连贯的的API构造静态类型的sql类查询。
有几个Spring数据模块通过QuerydslPredicateExecutor提供与Querydsl的集成,如下面的示例所示:
例43:QuerydslPredicateExecutor接口
public interface QuerydslPredicateExecutor<T> {
Optional<T> findById(Predicate predicate); //查找并返回与谓词匹配的单个实体。
Iterable<T> findAll(Predicate predicate); //查找并返回与谓词匹配的所有实体。
long count(Predicate predicate); //返回与谓词匹配的实体数量。
boolean exists(Predicate predicate); //返回与谓词匹配的实体是否存在。
// … more functionality omitted.
}
谓词的用法
要利用Querydsl支持,请在您的存储库接口上扩展QuerydslPredicateExecutor,如下面的示例所示:
例44:在存储库中整合Querydsl
interface UserRepository extends CrudRepository<User, Long>, QuerydslPredicateExecutor<User> {
}
前面的示例允许您使用Querydsl谓词实例编写类型安全的查询,如下面的示例所示:
Predicate predicate = user.firstname.equalsIgnoreCase("dave")
.and(user.lastname.startsWithIgnoreCase("mathews"));
userRepository.findAll(predicate);
2、Web支持
本节包含Spring Data web支持的文档,因为它是在Spring Data Commons的当前(及以后)版本中实现的。由于新引入的支持改变了很多东西,所以我们在web.legacy中保留了以前的行为文档。
例45:使Spring数据支持web
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}
@EnableSpringDataWebSupport
注释注册了一些我们稍后将讨论的组件。它还将检测类路径上的Spring HATEOAS,并为其注册集成组件(如果存在的话)。
或者,如果您使用XML配置,将SpringDataWebConfiguration
或HateoasAwareSpringDataWebConfiguration
注册为Spring bean
,如下面的示例所示(例如SpringDataWebConfiguration
)
例46:启用XML中的Spring Data web
支持
<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />
<!-- If you use Spring HATEOAS, register this one *instead* of the former -->
<bean class="org.springframework.data.web.config.HateoasAwareSpringDataWebConfiguration" />
基础Web支持
上一节中展示@EnableSpringDataWebSupport
的配置注册了几个基本组件:
-
DomainClassConverter
让Spring MVC
从请求参数或路径变量中解析存储库管理的域类的实例。 -
HandlerMethodArgumentResolver
实现,让Spring MVC
从请求参数中解析可分页和排序实例。
DomainClassConverter
允许您在Spring MVC
控制器方法签名中直接使用域类型,因此您不需要通过存储库手动查找实例,如下面的示例所示:
例47:在方法签名中使用域类型的Spring MVC控制器
@Controller
@RequestMapping("/users")
class UserController {
@RequestMapping("/{id}")
String showUserForm(@PathVariable("id") User user, Model model) {
model.addAttribute("user", user);
return "userForm";
}
}
如您所见,该方法直接接收用户实例,不需要进一步查找。通过让Spring MVC首先将path变量转换为域类的id类型,并最终通过调用为域类型注册的存储库实例的findById()
来访问该实例,可以解析该实例。
目前,存储库必须实现CrudRepository才能被发现进行转换。
用于可分页和排序的HandlerMethodArgumentResolvers
上一节中显示的配置片段还注册了一个PageableHandlerMethodArgumentResolver
以及SortHandlerMethodArgumentResolver
的实例。注册使Pageable
和Sort
成为有效的控制器方法参数,如下面的示例所示:
例48:使用分页Pageable
作为控制器参数
@Controller
@RequestMapping("/users")
class UserController {
private final UserRepository repository;
UserController(UserRepository repository) {
this.repository = repository;
}
@RequestMapping
String showUsers(Model model, Pageable pageable) {
model.addAttribute("users", repository.findAll(pageable));
return "users";
}
}
前面的方法签名会导致Spring MVC
尝试使用以下默认配置从请求参数派生一个可分页实例:
表1:Pageable 请求参数配置
参数名称 |
默认配置 |
---|---|
page |
您想要检索的页面,索引为0,默认值为0。 |
size |
要检索的页面的大小,默认为20。 |
sort |
排序属性,遵循property,property(,ASC|DESC)(,IgnoreCase)的格式,默认的排序是区分大小写的升序排序使用多个排序参数,如果你想切换方向或大小写敏感性,例如sort=firstname&sort=lastname,asc&sort=city,ignorecase。 |
要自定义这个行为,需要注册一个实现PageableHandlerMethodArgumentResolverCustomizer
接口或SortHandlerMethodArgumentResolverCustomizer
接口的bean。它的customize()
方法将被调用,从而允许您更改设置,如下面的示例所示:
@Bean SortHandlerMethodArgumentResolverCustomizer sortCustomizer() {
return s -> s.setPropertyDelimiter("<-->");
}
- Python数据增强(data augmentation)库--Augmentor 使用介绍
- Leetcode-Easy 101. Symmetric Tree
- 数据结构-栈的定义及python实现
- 【关关的刷题日记59】Leetcode 257 Binary Tree Paths
- 学大伟业 国庆Day2
- ECMAScript 6入门 - 变量的解构赋值
- 二叉排序树 python实现
- ES6新特性概览
- 数据结构-顺序表的定义及python实现
- 洛谷P1516 青蛙的约会
- python实现二叉树的创建和遍历
- python中numpy模块下的np.clip()的用法
- Leetcode-Easy 543. Diameter of Binary Tree
- Leetcode-Easy 572. Subtree of Another Tree
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 【项目实战】ADS 层数据导出
- 前端大杂货铺系列《七》
- BigData--大数据技术之Spark机器学习库MLLib
- 【LeetCode】三数之和
- BigData--大数据技术之SparkStreaming
- Jenkins 入门实战:GitHub Push触发Jenkins自动构建
- 2020最新编辑器集成eslint、prettier、stylelint,git提交预检查代码配置
- eslint+prettier学习
- C++ 友元函数
- BigData--大数据技术之SparkSQL
- BigData--大数据分析引擎Spark
- 大数据利器--Scala语言学习(高级)
- 大数据利器--Scala语言学习(基础)
- BCI-EEG脑电数据处理
- BCI--Python-EEG工具库MNE