扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
本人使用SpringDataJpa已经有一段时间了,很享受它给我带来简便的操作数据库的方式,完全可以不用去写SQL语句,爽歪歪。
但是SpringDataJpa提供的原生查询方法类型有限,某些场景下并不能满足使用需求。
例如:
- 一次查询中,我只想要查询数据表中某几个字段,而不是全部字段都取出来,当然
@Query
注解可以实现这个需求,但我并不想通过@Query
注解实现,因为懒!!!不想写SQL - 还有如果我们需要的查询条件里面有
in
的范围查询,原生的并没有提供这个功能啊。最终促使我去搞扩展的就是这个需要。
先展示一下扩展后的使用效果吧。
-
数据表是这样子的
-
我想要查询课程类型是“web”或者是“编程语言” 的课程,而且我只要
id
、courseName
、courseType
和teacherName
这四个字段。 -
测试代码
-
测试结果: 符合预期所想的。
这就搞定了,哈哈,简单吧? 是不是从表面使用上看不出来和原生的有什么区别? 下面是我实现扩展功能的具体代码,仅作为参考哦。
1、扩展项目的结构
1.1 扩展jpa相关的几个主要的类的各自作用
-
ExtendedJpaRepositoryApi
:定义扩展jpa的扩展查询类型的接口。 -
ExtendedSpecification
:扩展的Specification接口,用于构造in范围查询的where条件,字段过滤也需要用到这个类 -
SelectorBuilder
:一个辅助类,过滤字段的建造器,用于select 。。。,选择查询最终获取到的字段 -
ExtendedJpaRepository
:主要是这个类,扩展功能的实现类,ExtendedJpaRepositoryApi
定义的接口由它来实现。
2、各个类具体代码
2.1、ExtendedSpecification
2.2、ExtendedJpaRepositoryApi
2.3、ExtendedJpaRepository
这个类比较长,主要的关键代码都在这。
-
实现
ExtendedJpaRepositoryApi
接口的方法 -
下面是为了让上面的方法能够实现预期的查询效果,所复制改造或者重写
SimpleJpaRepository
类的一些方法
2.4、SelectorBuilder
3、测试使用
3.1、搞个实体类
注意:Course的构造方法在封装查询结果时是会用到的,而且构造方法的参数列表的排列顺序需要和上面的属性的排列顺序一致,就是说courseName
不能跑到id
的前面,其他类似。
3.2、再搞个Dao
就是这么简单。
3.3、CourseQueryDTO
它的作用是构造一个ExtendedSpecification
的实现类,在getWhere
方法里面用匿名内部类的方式实现。
getWhere
方法
决定最终查询结果有哪几个字段的代码如下
注意:append的顺序要和某个构造方法参数顺序一致
3.4、测试类CourseDaoTest
数据库信息
3.4.1测试查询部分字段
只要这三个字段
结果:
3.4.2、测试查询部分字段加分页
结果:只有上一个结果的前3条数据
3.4.3、测试in 范围查询
查询课程类型是:**“编程语言"或者"web”**的课程。
修改一下结果字段:
结果:
3.4.4、测试in 范围查询 加 分页
**结果:**因为是降序排序,所有取到了上一个结果的后三条数据
最后,源码在我的GitHub上:https://github.com/ljnsGitHub/spring-data-jpa-extend