直接继承BaseSpecificationQueryObjectRepository,注入 JpaSpecificationExecutor 和 实体对象即可,具体如下:
public class JpaBasedQueryRepository extends BaseSpecificationQueryObjectRepository {// 注入 JpaUserRepository 和 specificationConverterFactory(框架自动生成)public JpaBasedQueryRepository(JpaUserRepository userRepository,SpecificationConverterFactoryspecificationConverterFactory) {// 指定实体对象 JpaUsersuper(userRepository, JpaUser.class, specificationConverterFactory);}}
整体架构如下:
文章插图
核心流程如下:
- SpecificationConverter 将输入的 QueryObject 转换为 Specification、Pageable、Sort等实例 。
- 使用 SpecificationExecutor 实例的查询方法获取返回值 。
- 返回值通过 ResultConverter 将 Entity 转换为最终结果 。
- Pageable 。从 QueryObject 中读取 Pageable 属性,并转化为 Spring data 的 Pageable 实例 。
- Sort 。从 QueryObject 中读取 Sort 属性,并转换为Spring data 的 Sort 实例 。
- 过滤注解 。遍历 QueryObject 中属性,根据注解查找到注解处理器,由注解处理器将其转化为 Predicate 实例,最终封装为 Specification 示例 。
- 代码过于繁琐,容易出错,同时开发效率低下 。
- 对性能设计关注不足,容易遗漏,产生性能问题 。
对于代码繁琐问题,提出通过在 QueryObject 上增加注解的方式来实现简单查询 。
两者相结合,便形成了 Single Query 框架:
- 提供一套注解,应用于 QueryObject 之上,以声明化的方式完成查询定义 。
- 提供一套API,以 QueryObject 作为参数,提供 单条、批量、统计、分页等查询 。
- 提供MyBatis和Jpa两套实现 , 快速实现 QueryObjectRepository,以提升开发速度 。
【DDD死党:单引擎查询利器】
推荐阅读
- DDD死党:内存Join——将复用和扩展用到极致
- DDD 必备架构--六边形架构
- 解密DDD:高内聚对象组的维护之道
- 什么是基友什么是死党 什么是基友
- 死党是什么关系 基友是什么关系
- 死党是和闺蜜的意思一样吗知乎 死党是和闺蜜的意思一样吗
- DDD实战 - Repository模式的妙用
- 为什么从 MVC 到 DDD,架构的本质是什么?
- DDD 中关于应用架构的那些事
- 基于DDD的微服务落地