扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

本人使用SpringDataJpa已经有一段时间了,很享受它给我带来简便的操作数据库的方式,完全可以不用去写SQL语句,爽歪歪。
但是SpringDataJpa提供的原生查询方法类型有限,某些场景下并不能满足使用需求。
例如:

  • 一次查询中,我只想要查询数据表中某几个字段,而不是全部字段都取出来,当然@Query注解可以实现这个需求,但我并不想通过@Query注解实现,因为懒!!!不想写SQL
  • 还有如果我们需要的查询条件里面有in 的范围查询,原生的并没有提供这个功能啊。最终促使我去搞扩展的就是这个需要。

先展示一下扩展后的使用效果吧。

  • 数据表是这样子的
    扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

  • 我想要查询课程类型是“web”或者是“编程语言” 的课程,而且我只要idcourseNamecourseTypeteacherName这四个字段。

  • 测试代码
    扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

  • 测试结果: 符合预期所想的。
    扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

这就搞定了,哈哈,简单吧? 是不是从表面使用上看不出来和原生的有什么区别? 下面是我实现扩展功能的具体代码,仅作为参考哦。

1、扩展项目的结构

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

1.1 扩展jpa相关的几个主要的类的各自作用

  • ExtendedJpaRepositoryApi:定义扩展jpa的扩展查询类型的接口。
  • ExtendedSpecification:扩展的Specification接口,用于构造in范围查询的where条件,字段过滤也需要用到这个类
  • SelectorBuilder:一个辅助类,过滤字段的建造器,用于select 。。。,选择查询最终获取到的字段
  • ExtendedJpaRepository:主要是这个类,扩展功能的实现类,ExtendedJpaRepositoryApi定义的接口由它来实现。

2、各个类具体代码

2.1、ExtendedSpecification

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

2.2、ExtendedJpaRepositoryApi

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

2.3、ExtendedJpaRepository

这个类比较长,主要的关键代码都在这。

  • 实现ExtendedJpaRepositoryApi接口的方法
    扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

  • 下面是为了让上面的方法能够实现预期的查询效果,所复制改造或者重写SimpleJpaRepository类的一些方法

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

2.4、SelectorBuilder扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

3、测试使用

3.1、搞个实体类

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

注意:Course的构造方法在封装查询结果时是会用到的,而且构造方法的参数列表的排列顺序需要和上面的属性的排列顺序一致,就是说courseName不能跑到id的前面,其他类似。

3.2、再搞个Dao

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
就是这么简单。

3.3、CourseQueryDTO

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

它的作用是构造一个ExtendedSpecification的实现类,在getWhere方法里面用匿名内部类的方式实现。

getWhere方法
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
决定最终查询结果有哪几个字段的代码如下
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
注意:append的顺序要和某个构造方法参数顺序一致

3.4、测试类CourseDaoTest

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
数据库信息
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

3.4.1测试查询部分字段

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
只要这三个字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

结果:
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

3.4.2、测试查询部分字段加分页

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

结果:只有上一个结果的前3条数据

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

3.4.3、测试in 范围查询

查询课程类型是:**“编程语言"或者"web”**的课程。
修改一下结果字段:
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

结果:
扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

3.4.4、测试in 范围查询 加 分页

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段

**结果:**因为是降序排序,所有取到了上一个结果的后三条数据

扩展SpringDataJpa 的查询功能,添加sql的 in 范围查询,以及能够自定义选择查询结果字段
最后,源码在我的GitHub上:https://github.com/ljnsGitHub/spring-data-jpa-extend