第十四章:QueryDSL与SpringDataJPA共同服务于SpringBoot

QueryDSL是一个Java语言编写的通用查询框架,专注于通过JavaAPI方式构建安全的SQL查询。QueryDSL可以应用到NoSQL数据库上,QueryDSL查询框架可以在任何支持的ORM框架或者SQL平台上以一种通用的API方式来构建SQL。目前QueryDSL支持的平台包扣JPA、JDO、SQL、Java Collections、RDF、Lucene、Hibernate Serch、MongoDB等。

本章目标

学习使用SpringBoot项目下SpringDataJPA与QueryDSL框架整合,完成多表关系复杂查询。

构建项目

本章开发工具使用IntelliJ IDEA,我们创建一个SpringBoot项目,预先导入Web、SpringDataJPA、MySQL、Durid依赖,目录结构如下图1所示:

图1

配置SpringDataJPA

本章就不做详细的介绍SpringDataJPA了,请复制第十三章:SpringBoot实战SpringDataJPA(源码地址:git.oschina.net/jnyqy/lessons),章节内的application.yml配置文件到本章resources目录下。如下图2所示:

图2

创建测试表

本章使用两张表进行讲解,两张表之间存在关联外检关系,我们使用商品信息表商品分类信息表来讲解本章内容。

商品信息表结构如下图3所示:

图3

商品分类信息表结构如下图4所示:

图4

配置QueryDSL

我们在SpringBoot项目内使用queryDSL需要导入maven依赖以及添加maven插件,修改pom.xml配置文件添加querydsl依赖以及插件如下图5所示:

图5

上面我们导入的querydsl的maven依赖,下面的插件很重要,当我们执行maven compile命令的时候,queryDSL这个插件会自动在我们配置的目录下生成Qxxx结构化查询实体对象,querydsl完全采用面向对象的方式来创建查询。

生成Query查询对象

我们上面导入工作已经做完,接下来我们需要让maven执行querydsl的插件自动生成查询实体对象,我们需要先配置项目的maven命令,添加一条compile,点击:Run -> Edit Configurations -> "+" -> Maven,配置如下图6所示:

图6

配置完成后点击“Apply”后就已经配置好了,接下来我们运行maven compile命令,点击IntelliJ IDEA工具右上角选择maven compile执行,如下图7所示:

图7

点击绿色三角运行compile命令,控制台日志输出内容如下图8所示:

图8

maven输出的提示执行maven compile命令成功了,那么我们去target下查看是否已经创建了generated-sources/java目录,如下图9所示:

图9

文件内现在是没有内容的,因为我们还没有添加实体在项目中,下面我们根据数据库内的表结构创建对应实体。

商品信息实体内容如下图10所示:

图10

商品分类信息实体如下图11所示:

图11

上面两个实体内自行添加getter/setter方法,可以看到我们在商品信息实体内配置分类实体的关联而且是@OneToOne(一对一)的关联。

实体已经创建完成,下面我们再次执行maven compile命令,再次查看target下的querydsl目录内容变化,如下图12所示:

图12

目录内有两个querydsl插件自动生成的实体,命名规则就是原实体名称前+Q前缀。可以查看类内的代码,都是由querydsl插件自动构建的。

使用QueryDSL

准备工作已经做好,下面我们创建测试程序使用我们引入的querydsl完成查询功能,我们先来创建一个QueryController,作为访问入口,代码如下图13所示:

图13

使用QueryDslPredicateExecutor

我们创建一个GoodJPA接口,让其继承QueryDslPredicateExecutor接口,该接口是SpringDataJPA提供的querydsl查询接口。GoodJPA代码如下图14所示:

图14

这样GoodJPA就拥有了SpringDataJPA整合QueryDSL的方法实现,我们再来修改QueryController添加GoodJPASpring注入Bean,然后添加根据商品分类查询商品列表的方法。如下图15所示:

图15

上图5我们注入了EntityManager对象,因为我们构建JAPQuery对象需要它作为参数传入,使用QueryDSL查询的形式完全就是我们平时使用对象的形式那么简答,没有多余的内容!上面我完全使用的QueryDSL进行的查询操作,我们先像数据库表信息添加几条测试数据,然后访问测试下,下面接着说SpringDataJPA下怎么使用JPA。

独立QueryDSL查询测试

运行项目,访问地址:127.0.0.1:8080/query,界面输出内容如下图16所示:

图16

我查询的是分类为1的商品列表,可以看到数据完全正确的给我们返回了,这个仅仅是QueryDSL自己完成的操作,接下来我们使用SpringDataJPA整合QueryDSL完成相同的查询效果。

SpringDataJPA整合QueryDSL

我们打开QueryController添加join方法,代码如下图17所示:

图17

相对于单独的QueryDSL查询而言,整合的方式会更复杂一点,所以可以封装简单的查询对象来简化代码。

Inquirer

自定义查询实体类,该类可以完成查询添加封装,查询结果处理操作,具体代码如下图18、19所示:

图18

图19

简单的对查询条件,返回结果做出了封装,下面我们再来修改join方法的实现,如下图20所示:

图20

重启下项目访问地址测试,界面输出内容如下图21所示:

图21

总结

综上所述本章的内容已经讲解完成,本章主要讲解了SpringBoot项目下SpringDataJPA如果整合QueryDSL完成查询操作,单独QueryDSL查询如何完成查询,简单封装了查询对象Inquirer。

本章内容已上传到码云:

SpringBoot配套源码地址:https://gitee.com/hengboy/spring-boot-chapter

SpringCloud配套源码地址:https://gitee.com/hengboy/spring-cloud-chapter

SpringBoot相关系列文章请访问:目录:SpringBoot学习目录

QueryDSL相关系列文章请访问:QueryDSL通用查询框架学习目录

SpringDataJPA相关系列文章请访问:目录:SpringDataJPA学习目录

SpringBoot相关文章请访问:目录:SpringBoot学习目录,感谢阅读!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏艾斯博客www.vpsss.net

域名 DNS 中如何解析 A 记录

9385
来自专栏静下来

增加wordpress可以上传.torrent文件

今天想上传个文件,是.torrent后缀的。。就是种子,为什么要上传,咱就不说了。。。wordpress本身是不支持上传.torrent文件的,不过我们可以用代...

3385
来自专栏玩转JavaEE

MongoDB副本集搭建

我们之前的案例都是在单个节点上实现的,在生产环境中这种做法是有风险的,如果服务宕机、崩溃或者硬盘坏了都会对公司业务造成损失,因此我们需要数据备份。在MongoD...

3796
来自专栏同步博客

自定义搭建PHP开发环境

  3、将安装包准备好。http://pan.baidu.com/s/1mhxEPkc

1831
来自专栏用户2442861的专栏

git以及github的使用(1)

http://my.oschina.net/bxxfighting/blog/378196

631
来自专栏重庆的技术分享区

MySQL在windows下的安装与配置

官网版本: https://dev.mysql.com/downloads/mysql/5.6.html#downloads

2254
来自专栏Python自动化测试

python自动化环境搭建

selenium是测试web应用程序的框架,selenium为没有测试脚本的人提供了(seleniumide)提供了录制/回放的工具,同时它也提供了特定...

2033
来自专栏代码散人

利用XCode Targets创建多scheme的iOS项目

在我们的开发iOS的时候,通常会遇到一个项目打包成多个环境的问题,也会遇到一套代码打包成多个项目的问题,最常用的做法是写一个配置文件,在打包的时候修改一下配置文...

1424
来自专栏地方网络工作室的专栏

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(三)认识项目所有文件

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(三)认识项目所有文件 在《Vue2+VueRouter2+Webpack...

2335
来自专栏Linux运维学习之路

ansible批量管理软件部署及剧本

服务器版本信息: Centos6.9 [root@db02 ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 S...

9497

扫码关注云+社区

领取腾讯云代金券