场景还原:
由于业务调整,现有有一个新的需求改动,在之前返回的VO的基础上增加大概10个返回字段,在这里不讨论这次业务调整的合理性,仅讨论在已经调整的情况下,如何完成需求。这里在改之前的业务大概是需要用到A,B,C,D,E五张表,核心表是A,然后通过A.b_id与A.e_id与B,E表产生关联,再通过B,E表中的某些字段与C,D表进行关联。现在需要新返回的字段是D,F,G产生关联之后才能产生的。此外这个查询还需要对A上的check_a,check_b,check_c,check_status字段进行返回,通过当前用户的check权限匹配对应的字段是否为空同时上一级是否已经check,所以这里需要动态的生成SQL。
需求实现
刚刚接触业务时想到使用Mybatis的<if>标签,但是在权限判断部分如果使用在xml中写动态SQL进行逻辑的判断,是比较复杂的,同时还要考虑到后期对应判断条件进行修改的情况,再结合每次返回的数据在A中都只会查到一次,故采用了第二种方式:对应A的单表部分使用Mybatis-Plus的Lambda表达式进行查询,再根据返回的b_id与e_id当做参数进行第二次的多表关联查询。大致逻辑如下:
@Override
public IPage<InspectionAuditInfoVO> page(PageBeanSearch<SearchCriteria> pageBeanSearch) {
// 获取当前用户的审批角色配置
Map<String, AuditConfiguration> auditNodes = auditConfigurationService.getAuditNodes();
if (auditNodes == null || auditNodes.isEmpty()) {
return new Page<>();
}
// 构建查询条件:当前审批节点为用户的待审批列表,且前置审批已完成
LambdaQueryWrapper<BusinessEntity> queryWrapper = loadQueryWrapper(auditNodes);
// 根据搜索条件追加过滤逻辑
queryWrapper.eq(Objects.nonNull(pageBeanSearch.getQuery().getCriteriaField()), BusinessEntity::getEntityField, pageBeanSearch.getQuery().getCriteriaValue());
queryWrapper.ge(Objects.nonNull(pageBeanSearch.getQuery()