哈喽,大家好,我是指北君。
今天给大家介绍一个JPA的好搭档:QueryDSL。
0. 前言
相对于 MyBatis ,本人更喜欢 Spring Data JPA ,因为它更符合面向对象的思想,然而 JPA 对复杂的查询支持较弱,常见的有两种方式:
一种方式是Repository继承JpaSpecificationExecutor接口,优点是支持复杂查询、编译期可以规避一些语法错误,缺点是语法晦涩难懂,学习成本太高。
还有一种方式就是直接写 SQL ,可以通过JdbcTemplate或者@Query注解的方式查询,优点是简单,缺点嘛…先看段代码:
1 |
|
看着想吐,就是直接写SQL的缺点。
下面隆重介绍 JPA 的最佳搭档:QueryDSL。它的语法跟SQL一样简单,且代码清晰,具有代码提示、编译期错误检查等优势。同时,在架构的层次上实现了读写分离:JPA负责增删改、QueryDSL负责查询。
1. QueryDsl介绍
QueryDSL 是一个通用的查询框架,专注于通过 Java API 构建类型安全的SQL查询。
QueryDSL 可以通过一组通用的查询 API 为用户构建出适合不同类型ORM框架或者是 SQL 的查询语句,也就是说 QueryDSL 是基于各种 ORM 框架以及 SQL 之上的一个通用的查询框架。
借助 QueryDSL 可以在任何支持的 ORM 框架或者 SQL 平台上以一种通用的API方式来构建查询。目前 QueryDSL 支持的平台包括 JPA、JDO、SQL、Mongodb 等等。
2. 引入QueryDSL
本文以gradle构建为例,前提是已引入 Spring Data Jpa ,且JPA可正常使用。
1 |
|
引入JPAQueryFactory
1 |
|
3. 创建JPA Entity
我们分别创建两个示例实体类:职员表、部门表。
1 |
|
编译后,QueryDSL 会帮助我们会自动生成两个Q类:QEmp、QDep ,我们之后进行的所有查询都是围绕这些Q类来进行的。
4. 简单查询
QueryDSL提供了一种类似于SQL的面向对象写法,并且是类型安全的,搭配上IDEA的语句提示功能,写起SQL来非常舒服。
请欣赏下面的例子:
1 |
|
4. 复杂查询
QueryDSL对于复杂查询的支持也是相当优秀的,比如多表关联、动态条件查询等。
1 |
|
小结
以上就是 QueryDSL 的简单应用,用写SQL的方法来写代码,是不是很舒服呢!文中的例子仅仅浅尝辄止,希望大家可以实际应用一下,后续我也会更深入的讲解一些 QueryDSL 的高级用法。
写在最后
时隔2个月,某鱼群再次限时开放了。
Java技术指北读者交流群,(聊天学习摸鱼,白嫖技术课程为主),又不定时开放了,有一群有趣有料的小伙伴在等你哦!进群方式:公众号后台回复 666 。