Spring JPA 拓展

翻译:Spring Data Extensions

本节记录了一组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配置,将SpringDataWebConfigurationHateoasAwareSpringDataWebConfiguration注册为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的配置注册了几个基本组件:

  • DomainClassConverterSpring 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的实例。注册使PageableSort成为有效的控制器方法参数,如下面的示例所示:

例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("<-->");
}

Spring JPA 拓展的更多相关文章

  1. spring jpa 实体互相引用返回restful数据循环引用报错的问题

    spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLa ...

  2. spring jpa 自定义查询数据库的某个字段

    spring jpa 提供的查询很强大, 就看你会不会用了. 先上代码, 后面在解释吧 1. 想查单个表的某个字段 在repository中 @Query(value = "select i ...

  3. Hibernate | Spring JPA | MySQL 使用过程遇到的一些问题

    1. 使用过程 2. 背景 3. 遇到问题 3.1 不指定Hibernate数据库方言,默认SQL生成方式 3.2 抛出异常Hibernate加入了@Transactional事务不会回滚 3.3 H ...

  4. Spring JPA 使用@CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy 自动生成时间和修改者

    JPA Audit 在spring jpa中,支持在字段或者方法上进行注解@CreatedDate.@CreatedBy.@LastModifiedDate.@LastModifiedBy,从字面意思 ...

  5. Spring JPA学习笔记

    目录 什么是JPA? 引入配置 新建一个Entity Bean类 JPA的增删改查 新建操作接口 新建测试类 总结 什么是JPA? 什么是JDBC知道吧?数据库有Mysql,SQL Server,Or ...

  6. Spring JPA实现逻辑源码分析总结

    1.SharedEntityManagerCreator: entitymanager的创建入口 该类被EntityManagerBeanDefinitionRegistrarPostProcesso ...

  7. 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序

    显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...

  8. spring jpa和mybatis整合

    spring jpa和mybatis整合 前一阵子接手了一个使用SpringBoot 和spring-data-jpa开发的项目 后期新加入一个小伙伴,表示jpa相比mybatis太难用,多表联合的查 ...

  9. 一篇搞定spring Jpa操作数据库

    开始之前你必须在项目配置好数据库,本文使用的spring boot,相比spring,spring boot省去了很多各种对以来组件复杂的配置,直接在pom配置组件,完后会自动帮我们导入组件 < ...

随机推荐

  1. python8.1多线程

    import threadingimport time def run1 (name,sex): print(name,sex,"执行线程1") time.sleep(3)def ...

  2. QString字符串的查找与截取实例

    QString是Qt中封装的字符串类,相对于标准库里的string,使用方法有些不同,个人感觉使用qt习惯后,感觉QString更好用,下面的代码主要是针对QString的字符查找.截取做的测试: # ...

  3. 关于海思SDK在Ubuntu下安装错误问题

    在Ubuntu下安装海思sdk时,直接运行安装脚本,会有如下提示: ./sdk.unpack  ./sdk.unpack: 2: ./sdk.unpack: source: not found ./s ...

  4. 介绍一种 Python 更方便的爬虫代理池实现方案

    现在搞爬虫,代理是不可或缺的资源 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...

  5. 排查Mysql突然变慢的一次过程

    排查Mysql突然变慢的一次过程 上周客户说系统突然变得很慢,而且时不时的蹦出一个 404 和 500,弄得真的是很没面子,而恰巧出问题的时候正在深圳出差,所以一直没有时间 看问题,一直到今天,才算是 ...

  6. C#LeetCode刷题之#110-平衡二叉树(Balanced Binary Tree)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4074 访问. 给定一个二叉树,判断它是否是高度平衡的二叉树. 本 ...

  7. Golang笔记整理--One day

    题外话: 很早就有整理学习笔记的想法,今天将想法付诸于行动,将Golang相关知识系统整理一遍,此分类为Golang学习笔记,最近开始学习这门语言的同学可以参考. 一 第一个Go程序: hello.g ...

  8. Oracle数据泵导出使用并行参数,单个表能否真正的并行?

    对于Oracle 数据泵expdp,impdp是一种逻辑导出导入迁移数据的一个工具,是服务端的工具,常见于DBA人员使用,用于数据迁移.从A库迁移至B库,或者从A用户迁移至B用户等. 那么有个疑问? ...

  9. puppeteer去掉同源策略及请求拦截

    puppeteer是一个功能强大的工具,在自动化测试和爬虫方面应用广泛,这里谈一下如何在puppeteer中关掉同源策略和进行请求拦截. 同源策略 同源策略为web 安全提供了有力的保障,但是有时候我 ...

  10. Linux查看系统硬件信息命令汇总

    对工作中,经常用的查看系统硬件命令的一个简单总结 1.查看磁盘类型(是否SSD盘)cat /sys/block/sda/queue/rotational注意:命令中的sba是你的磁盘名称,可以通过df ...